Wikioi 1002

来源:互联网 发布:linux强制杀死进程 编辑:程序博客网 时间:2024/04/28 05:21
#include<iostream>#include<cstdio>#include<cstring>#include<cstdlib>#include<cmath>#include<queue>#include<stack>using namespace std;#define maxn 2600#define INF 0xffffffint father[maxn];struct Map{    int x, y;}map[maxn];struct node{    int a, b, len;    friend bool operator < (node x, node y)    {        return x.len > y.len;    }};int find(int x);int Union(int x, int y);int Distance(Map a, Map b);void kruskal(int n);int main(){    int m, n;    while(cin >> m >> n)    {        int i, j, k=0;        char ch;        for(i=1; i<=m; i++)        for(j=1; j<=n; j++)        {            cin >> ch;            if(ch == '#')            {                map[++k].x = i;                map[k].y = j;            }        }        for(i=1; i<=k; i++)            father[i] = i;        kruskal(k);    }    return 0;}int find(int x){    if(father[x] != x)        return father[x] = find(father[x]);    return x;}int Union(int x, int y){    x = find(x), y = find(y);    if(x != y)    {        father[x] = y;        return 1;    }    return 0;}int Distance(Map a, Map b){    int dx = abs(a.x - b.x), dy = abs(a.y - b.y);    if(dx <= 1 && dy <= 1)return 0;    if(dx <= 1)return dy-1;    if(dy <= 1)return dx-1;    return INF;}void kruskal(int n){    priority_queue<node> que;    int i, j, k, sum=0, ans=0;    node q;    for(i=1; i<n; i++)    for(j=i+1; j<=n; j++)    {        q.len = Distance(map[i], map[j]);        if(q.len == 0)            k = Union(i, j);        else if(q.len != INF)        {            q.a = i, q.b = j;            que.push(q);        }    }    for(i=1; i<=n; i++)        if(father[i] == i)            ans++;    k = 0;    while(que.size())    {        q = que.top(), que.pop();        if(Union(q.a, q.b))        {            sum += q.len;            k++;        }    }    cout << ans <<endl;    cout << k << " " << sum <<endl;}

0 0
原创粉丝点击