HDU 1879 继续畅通工程 prim算法 最小生成树
2015-08-07 19:17
501 查看
原题: http://acm.hdu.edu.cn/showproblem.php?pid=1879
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 17996 Accepted Submission(s): 7766
Problem Description
省政府“畅通工程”的目标是使全省任何两个村庄间都可以实现公路交通(但不一定有直接的公路相连,只要能间接通过公路可达即可)。现得到城镇道路统计表,表中列出了任意两城镇间修建道路的费用,以及该道路是否已经修通的状态。现请你编写程序,计算出全省畅通需要的最低成本。
Input
测试输入包含若干测试用例。每个测试用例的第1行给出村庄数目N ( 1< N < 100 );随后的 N(N-1)/2 行对应村庄间道路的成本及修建状态,每行给4个正整数,分别是两个村庄的编号(从1编号到N),此两村庄间道路的成本,以及修建状态:1表示已建,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
题目:
继续畅通工程Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 17996 Accepted Submission(s): 7766
Problem Description
省政府“畅通工程”的目标是使全省任何两个村庄间都可以实现公路交通(但不一定有直接的公路相连,只要能间接通过公路可达即可)。现得到城镇道路统计表,表中列出了任意两城镇间修建道路的费用,以及该道路是否已经修通的状态。现请你编写程序,计算出全省畅通需要的最低成本。
Input
测试输入包含若干测试用例。每个测试用例的第1行给出村庄数目N ( 1< N < 100 );随后的 N(N-1)/2 行对应村庄间道路的成本及修建状态,每行给4个正整数,分别是两个村庄的编号(从1编号到N),此两村庄间道路的成本,以及修建状态:1表示已建,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
思路:
因为输入的点有n*(n-1)/2,即包含了所有情况,所以对于没有修通的路,它的花费就是输入的花费,对于修通的路,花费为0,跑一次prim算法即可求出答案。代码:
#include"cstdio" #include"iostream" #include"string.h" #define INF 0x7f7f7f7f using namespace std; const int N = 1005; int n; int dis ; int maze ; bool vis ; void init() { for(int i=0; i<N; i++) { for(int j=0; j<N; j++) { maze[i][j]=INF; } dis[i]=INF; } memset(vis,false,sizeof(vis)); } int prim() { int ans=0; dis[1]=0; for(int i=1; i<=n; i++) { int minx=INF; int minn=INF; for(int j=1; j<=n; j++) { if(vis[j]==false&&dis[j]<minn) { minn=dis[j]; minx=j; } } vis[minx]=true; ans=ans+minn; for(int j=1; j<=n; j++) { if(vis[j]==false&&dis[j]>maze[minx][j]) dis[j]=maze[minx][j]; } } return ans; } int main() { while(scanf("%d",&n),n) { init(); int x,y,len,flag; for(int i=1;i<=n*(n-1)/2;i++) { scanf("%d %d %d %d",&x,&y,&len,&flag); if(flag==0) { maze[x][y]=len; maze[y][x]=len; } else { maze[x][y]=0; maze[y][x]=0; } } printf("%d\n",prim()); } return 0; }
相关文章推荐
- 上传文件块client实现
- 用百度API实现热(WIFI)、GPS、基站定位
- Win10开发:数据绑定
- 【CODEFORCES】 B. Towers
- POJ-1581 A Contesting Decision-模拟ACM比赛时的评分规则
- C#高级编程七十九天----反射
- C++(11)标准I/O库
- springMVC获取request和response
- hdu 5358 First One(二进制+twopoint)
- POJ-1552 Doubles-二倍关系
- Docker初识
- (转)CSS中空格的写法
- SQL语句必会的50题
- (转)CSS中空格的写法
- 枚举需要的注意事项
- POJ-1338 Ugly Numbers-被2,3,5整除的数
- MATLAB中如何直接曲线拟合,而不使用cftool的GUI界面
- 软件测试中条件覆盖,路径覆盖,语句覆盖,分支覆盖的区别
- iphone休眠模式下,js定时器无法执行
- python 读写csv格式文件