图算法—Problem E

来源:互联网 发布:数据规范性的名词解释 编辑:程序博客网 时间:2024/05/17 21:58
                                   图算法—Problem E

题意
省政府“畅通工程”的目标是使全省任何两个村庄间都可以实现公路交通(但不一定有直接的公路相连,只要能间接通过公路可达即可)。现得到城镇道路统计表,表中列出了任意两城镇间修建道路的费用,以及该道路是否已经修通的状态。现请你编写程序,计算出全省畅通需要的最低成本。
解题思路
不多说,还是最小生成树问题。用的Kruskal方法。
感想
最近忙着复习,哎,事情好多,acm不能停。
AC代码

#include <stdio.h>  #include <algorithm>  using namespace std;  struct Road  {      int u,v,c;  }r[10001];  int n,m,father[10001];  bool cmp(Road r1,Road r2)  {      return r1.c<r2.c;  }  // 并查集系列函数  1-初始化 2-查找 3-合并  void Init( int n )  {      int i;      for(i=1;i<=n;++i)          father[i]=i;  }  int Find(int m)  {      while( father[m]!=m )      {   m=father[m];    }      return m;  }  void Combine( int a,int b)  {      int temp_a,temp_b;      temp_a=Find(a);      temp_b=Find(b);      if( temp_a!=temp_b )          father[temp_a]=temp_b;  }  int Kruskal( void )  {      sort(r,r+m,cmp);      Init(n);      Road rd;      int i,res;      // 构建最小生成树      res=0;      for( i=0;i<m;++i )      {          rd=r[i];          if( Find(rd.u)!=Find(rd.v) )          {              Combine(rd.u,rd.v);              res+=rd.c;          }      }      return res;  }  int main()  {      int i,start,finish,cost,iscon;      while( scanf("%d",&n) && n )      {          // 求边的数量          m = n*(n-1)/2;          for( i=0;i<m;++i )          {              scanf("%d%d%d%d",&start,&finish,&cost,&iscon);              r[i].u=start;              r[i].v=finish;              // 如果道路已经修建,消耗设置为0,不需要我们再去建立道路              if( iscon ) r[i].c=0;              else    r[i].c=cost;          }          printf("%d\n",Kruskal());      }      return 0;  }  
0 0
原创粉丝点击