HDU 1879 继续畅通工程

来源:互联网 发布:sma4软件下载 编辑:程序博客网 时间:2024/05/17 11:58

杭电 1879 继续畅通工程

题目中文,还是不解释,直接上代码.

#include<stdio.h>  #include<algorithm>#include <iostream>   using namespace std;  struct engin{      int a,b,c,d;}bug[5000];  int p[105],n,m;  int cmp(engin x,engin y)  {if(x.d!=y.d)return x.d<y.d;// 先排序d 是否已经修建     return x.c<y.c;  //在同样没有修建的情况下,比较权值 }int find(int x)  {if (x!=p[x])p[x]=find(p[x]);  //找出他们的父亲节点,也就是最终到p[m]最后的数值一样就输出sum     return p[x];  }  void kruskal()  {      int i,sum=0;    sort(bug+1,bug+m+1,cmp);     for(i=1;i<=m;i++)      {          int x=find(bug[i].a);          int y=find(bug[i].b);          if(x!=y&&!bug[i].d)         {sum+=bug[i].c;              p[x]=y;          }      }    printf("%d\n",sum); }void join(int x,int y)  {      x=find(x);      y=find(y);      if(x!=y)      p[x]=y;  }   int main()  {      while(scanf("%d",&n)&&n)      {          int i;m=n*(n-1)/2;  for(i=1;i<=n;i++)    p[i]=i;        for(i=1;i<=m;i++)          {scanf("%d%d%d%d",&bug[i].a,&bug[i].b,&bug[i].c,&bug[i].d);          if(bug[i].d==1)            join(bug[i].a,bug[i].b);//如果已经修建,就把它加入到已经修建的序列里面 }kruskal();      }      return 0;  }

因为这个题目是增加了一个之前两个村庄是否相连的数据,所以,首先在排序的时候应该要把是否相连放在第一,然后才是权值,还有当两村庄已经相连时,一个月把他们之间加入到 已经修建的序列里,即把他们的父节点改成不是他们自己,加入树中.

0 0
原创粉丝点击