HDU1863畅通工程

来源:互联网 发布:剑灵人男捏脸数据吧 编辑:程序博客网 时间:2024/06/06 04:53

这是我第一次接触图论。。。

这个题不难,是并查集和Kruskal算法的应用

就是先对边进行排序,判断两个点的关系。。。

#include<stdio.h>
#include<stdlib.h>
#define MAX 9999999

int i,k,f1,f2,m,n,sum;
int father[101];

struct NODE{
    int u;  // 起点
 int v;  // 终点
 int w;  // 权值  
}G[MAX];

int find(int x)                           // 求点的父结点
{
    if(father[x]!=x)  father[x]=find(father[x]);
 return father[x];
}

int cmp(const void *a,const void *b)      // 对边进行从小到大的排序
{
 struct NODE *c = (struct NODE *)a;
 struct NODE *d = (struct NODE *)b;
    return c->w - d->w; 
}

void Kruskal()
{
 sum=0;
 for(i=1;i<=n;i++)  father[i]=i;
 for(i=1,k=1;i<=n && k<m;i++){
  f1=G[i].u; f2=G[i].v;
  f1=find(f1); f2=find(f2);
  if(f1!=f2){
      sum+=G[i].w;
   k++;
   if(f1>f2) father[f1]=f2;  
   else  father[f2]=f1;
  } 
    }
 if(k==m) printf("%d\n",sum);
 else printf("?\n");
}

int main()
{
 while(scanf("%d%d",&n,&m)!=EOF && n)
 {
     for(i=1;i<=n;i++)  scanf("%d%d%d",&G[i].u,&G[i].v,&G[i].w); 
  qsort(G,n,sizeof(G[1]),cmp); 
  Kruskal();
 }
    system("pause");
 return 0; 
}

原创粉丝点击