hdu1223(贪心+并查集=kruskal算法)

来源:互联网 发布:mac电脑安装双系统 编辑:程序博客网 时间:2024/06/05 19:32

这题意思是,求出形成不成环的图路线权值之和的最小值(每两个城市路线有权值),就先用一个结构体,把每组中那两个城市,城市之间权值,存下来,用这个权值排序,按从小到大,连接每两个城市,形成一个没有环的图,最后输出这个和。据称这个算法叫kruskal算法,还很很好理解的。

#include<cstdio>#include<algorithm>using namespace std;struct note{    int a,b,c;};struct note city[5001];int cmp(struct note x,struct note y){    return x.c<y.c;}int father[101],ok;void init(){    for(int i=0;i<101;i++)        father[i]=i;}int find_father(int x){    return x==father[x]?x:find_father(father[x]);}void merge_father(int x,int y){  int tx=find_father(x);  int ty=find_father(y);  if(tx==ty)  {      ok=0;      return;  }    else      father[ty]=tx;}int main(){    int n;    while(~scanf("%d",&n)&&n)    {        init();        int sum=0;        for(int i=0;i<n*(n-1)/2;i++)            scanf("%d %d %d",&city[i].a,&city[i].b,&city[i].c);        sort(city,city+n*(n-1)/2,cmp);        for(int i=0;i<n*(n-1)/2;i++)        {            ok=1;            merge_father(city[i].a,city[i].b);            if(ok)            {               sum+=city[i].c;            }        }        printf("%d\n",sum);    }}
0 0
原创粉丝点击