poj 2421

来源:互联网 发布:淘宝怎么给五星好评 编辑:程序博客网 时间:2024/04/29 11:32

kruskal算法:

#include <iostream>#include <cstdio>#include <cstring>#include <algorithm>const int maxn = 110;using namespace std;int rt[maxn];struct edge{   int l,r,w;}ee[maxn*maxn];int map[maxn][maxn],flag[maxn][maxn];int nedge;//路的条数bool Cmp(edge x, edge y){ return x.w < y.w; }void Build(int n){   for(int i = 1; i <= n; ++i)      rt[i] = i;}int Find(int x){    if(rt[x] == x) return x;    return Find(rt[x]);}void Union(int x, int y){    int xrt = rt[x];    int yrt = rt[y];    if(xrt != yrt)       rt[xrt] = yrt;}int Kruskal(){     int rt1,rt2,ans=0;     for(int i = 0; i < nedge; ++i){             rt1 = Find(ee[i].l);             rt2 = Find(ee[i].r);             if(rt1 != rt2){                 ans += ee[i].w;                 Union(rt1,rt2);             }     }     return ans;}int main(){    int n;    while(~scanf("%d",&n)){          Build(n);          for(int i = 1; i <= n; ++i)            for(int j = 1; j <= n ; ++j)              scanf("%d",&map[i][j]);          nedge = 0;          for(int i = 1; i < n; ++i)             for(int j = i+1; j <= n; ++j){               ee[nedge].l = i;               ee[nedge].r = j;               ee[nedge].w = map[i][j];               nedge++;             }          int m;          scanf("%d",&m);          while(m--){               int a,b;               scanf("%d %d",&a,&b);               int rt1 = Find(a);               int rt2 = Find(b);               Union(rt1,rt2);          }          sort(ee,ee+nedge,Cmp);          printf("%d\n",Kruskal());    }    return 0;}


 

原创粉丝点击