继续畅通工程

题目描述:
    省政府“畅通工程”的目标是使全省任何两个村庄间都可以实现公路交通(但不一定有直接的公路相连,只要能间接通过公路可达即可)。现得到城镇道路统计表, 表中列出了任意两城镇间修建道路的费用,以及该道路是否已经修通的状态。现请你编写程序,计算出全省畅通需要的最低成本。
输入:
    测试输入包含若干测试用例。每个测试用例的第1行给出村庄数目N ( 1< N < 100 );随后的 N(N-1)/2 行对应村庄间道路的成本及修建状态,每行给4个正整数,分别是两个村庄的编号(从1编号到N),此两村庄间道路的成本,以及修建状态:1表示已建,0表示 未建。

    当N为0时输入结束。
输出:
    每个测试用例的输出占一行,输出全省畅通需要的最低成本。
样例输入:
3
1 2 1 0
1 3 2 0
2 3 4 0
3
1 2 1 0
1 3 2 0
2 3 4 1
3
1 2 1 0
1 3 2 1
2 3 4 1
0
样例输出:
3
1
0

  1 #include 
  2 #include 
  3 #include 
  4 #include 
  5 #include 
  6 #include 
  7 #include 
  8 #include 
  9 #include 
 10 #include 
 11 #include 
 12 #include 
 13 #include <set>
 14 #include <string>
 15 #include 
 16 
 17 #define MAXD 99999999
 18 using namespace std;
 19 
 20 
 21 int fa[1000];
 22 
 23 struct Node{
 24     int v1,v2;
 25     int cost;
 26 };
 27 
 28 vectorvt;
 29 
 30 
 31 bool cmp(Node x,Node y)
 32 {
 33     if(x.cost<y.cost)
 34         return true;
 35     return false;
 36 }
 37 
 38 int findfa(int v)
 39 {
 40     while(fa[v]>0)
 41     {
 42         v=fa[v];
 43     }
 44     return v;
 45 }
 46 
 47 
 48 
 49 
 50 
 51 
 52 
 53 int main()
 54 {
 55 
 56     
 57 int n,m;
 58 
 59 int i,j,k;
 60 
 61 while(scanf("%d",&n)!=EOF)
 62 {
 63     m=n*(n-1)/2;
 64 
 65     if(n==0)
 66         break;
 67 
 68     int len=0;
 69     vt.clear();
 70 
 71 
 72     
 73 
 74 
 75     for(i=0;i)
 76     {
 77         int a,b,c,d;
 78 
 79         scanf("%d%d%d%d",&a,&b,&c,&d);
 80 
 81         if(d==1)
 82             c=0;
 83 
 84         for(j=0;j)
 85         {
 86         
 87             if((vt[j].v1==a)&&(vt[j].v2==b))
 88             break;
 89 
 90             if((vt[j].v1==b)&&(vt[j].v2==a))
 91             break;
 92         }
 93 
 94         if(j<len)
 95         {
 96             if(vt[j].cost>c)
 97                 vt[j].cost=c;
 98         }
 99         else
100         {
101             Node ans;
102             ans.v1=a;
103             ans.v2=b;
104             ans.cost=c;
105             vt.push_back(ans);
106             len++;
107 
108         }
109     }
110 
111 
112     sort(vt.begin(),vt.end(),cmp);
113 
114     
115 
116     for(i=1;i<=n;i++)
117     {fa[i]=0;}
118 
119 
120     int num=0;
121     int mincost=0;
122 
123 
124 
125     for(i=0;i)
126     {
127         int f1=findfa(vt[i].v1);
128         int f2=findfa(vt[i].v2);
129 
130         if(f1!=f2)
131         {
132             mincost+=vt[i].cost;
133             num++;
134             fa[f1]=f2;
135 
136             if(num==(n-1))
137                 break;
138 
139 
140 
141         }
142 
143     }
144 
145 
146     printf("%d\n",mincost);
147 }
148 
149 
150 
151             
152          
153         
154 
155 
156     return 0;
157 }

 

转载于:https://www.cnblogs.com/zjushuiping/archive/2012/05/30/2526842.html

你可能感兴趣的:(继续畅通工程)