hdu1102 最小生成树

来源:互联网 发布:淘宝增值服务是什么 编辑:程序博客网 时间:2024/06/06 03:20
/*  思路:水题,直接先将连接起来的边处理掉,将他们连接到一个集合 用并查集,其余的就是克鲁斯卡尔了*/#include<stdio.h>#include<string.h>#include<stdlib.h>#include<vector>#include<algorithm>using namespace std;struct edge{    int from,to,w;};int n,m;vector<edge>edges;int map[101][101]; int top; int pre[101];void addedge(int x,int y,int w){    edge v={x,y,w};    edges.push_back(v);}bool cmp(edge a,edge b){    return a.w<b.w;}int find(int x){    if(x==pre[x])    {        return x;    }    else    {        pre[x]=find(pre[x]);        return pre[x];    }}void kluska(){       int sum=0;    for(int i=0;i<edges.size();i++)    {         edge v=edges[i];         int f1=find(v.from);         int f2=find(v.to);         if(f1!=f2)         {             pre[f2]=f1;             top--;             sum+=v.w;         }         if(top==1) break;    }    printf("%d\n",sum);}int main(){    while(scanf("%d",&n)!=EOF)    {   edges.clear();        for(int i=1;i<=n;i++)        {            for(int j=1;j<=n;j++)            {                scanf("%d",&map[i][j]);            }        }        for(int i=1;i<=n;i++)        {            for(int j=1;j<=n;j++)            {                if(map[i][j]!=0)                {                    addedge(i,j,map[i][j]);                     //printf("aa");                }            }        }        int q;        scanf("%d",&q);        sort(edges.begin(),edges.end(),cmp);        for(int i=1;i<=n;i++)        {            pre[i]=i;        }        top=n;        for(int i=1;i<=q;i++)        {            int x,y;            scanf("%d%d",&x,&y);            int f1=find(x);            int f2=find(y);            if(f1!=f2)            {                pre[f2]=f1;                top--;            }        }        kluska();    }}

原创粉丝点击