并查集+最小生成树
继续畅通工程
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 16278 Accepted Submission(s):
7010
Problem Description
省政府“畅通工程”的目标是使全省任何两个村庄间都可以实现公路交通(但不一定有直接的公路相连,只要能间接通过公路可达即可)。现得到城镇道路统计表,表中列出了任意两城镇间修建道路的费用,以及该道路是否已经修通的状态。现请你编写程序,计算出全省畅通需要的最低成本。
Input
测试输入包含若干测试用例。每个测试用例的第1行给出村庄数目N ( 1< N < 100 );随后的
N(N-1)/2
行对应村庄间道路的成本及修建状态,每行给4个正整数,分别是两个村庄的编号(从1编号到N),此两村庄间道路的成本,以及修建状态:1表示已建,0表示未建。
当N为0时输入结束。
当N为0时输入结束。
Output
每个测试用例的输出占一行,输出全省畅通需要的最低成本。
Sample Input
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
Sample Output
3
1
0
kruskal算法
#include<stdio.h> #include<algorithm> using namespace std; int set[110]; struct record { int beg; int end; int ju; int tai; }s[11000]; int find(int fa) { int ch=fa; int t; while(fa!=set[fa]) fa=set[fa]; while(ch!=fa) { t=set[ch]; set[ch]=fa; ch=t; } return fa; } void mix(int x,int y) { int fx,fy; fx=find(x); fy=find(y); if(fx!=fy) set[fx]=fy; } bool cmp(record a,record b) { return a.ju<b.ju; } int main() { int n,m,j,i,sum,city; while(scanf("%d",&city)&&city!=0) { for(i=0;i<=city;i++) set[i]=i; n=city*(city-1)/2; for(i=0;i<n;i++) { scanf("%d%d%d%d",&s[i].beg,&s[i].end,&s[i].ju,&s[i].tai); } sort(s,s+n,cmp); for(i=0;i<n;i++) { if(s[i].tai==1) //此处将所有已修道路连接 mix(s[i].beg,s[i].end); } sum=0; for(i=0;i<n;i++) { if(s[i].tai==0) { if(find(s[i].beg)!=find(s[i].end))//没有连接的城市,查看是否有路可以通过 { //若没有则将其联通并记录下成本 mix(s[i].beg,s[i].end); sum+=s[i].ju; } } } printf("%d ",sum); } return 0; }//此代码与 还是畅通工程 有以上区别,其余详解请看 我的另一篇文章 还是畅通工程
prime算法
#include<stdio.h> #include<string.h> #define INF 0x3f3f3f int city; int lowcost[110],map[110][110],visit[110]; void prime() { int min,j,i,mincost=0,next; memset(visit,0,sizeof(visit)); for(i=1;i<=city;i++) { lowcost[i]=map[1][i]; } visit[1]=1; for(i=1;i<city;i++) { min=INF; for(j=1;j<=city;j++) { if(!visit[j]&&min>lowcost[j]) { min=lowcost[j]; next=j; } } mincost+=min; visit[next]=1; for(j=1;j<=city;j++) { if(!visit[j]&&lowcost[j]>map[next][j]) lowcost[j]=map[next][j]; } } printf("%d ",mincost); } int main() { int m,j,i,sum,x,y,c,d; while(scanf("%d",&city)&&city!=0) { memset(map,INF,sizeof(map)); m=city*(city-1)/2; while(m--) { scanf("%d%d%d%d",&x,&y,&c,&d); if(d==1) map[x][y]=map[y][x]=0; else map[x][y]=map[y][x]=c; } prime(); } return 0; }