2016sdau课程练习专题三 1005
来源:互联网 发布:淘宝买的电影票能退吗 编辑:程序博客网 时间:2024/06/06 14:19
1.题目编号
1005
2.简单题意
省政府“畅通工程”的目标是使全省任何两个村庄间都可以实现公路交通(但不一定有直接的公路相连,只要能间接通过公路可达即可)。现得到城镇道路统计表,表中列出了任意两城镇间修建道路的费用,以及该道路是否已经修通的状态。现请你编写程序,计算出全省畅通需要的最低成本。
输入:测试输入包含若干测试用例。每个测试用例的第1行给出村庄数目N ( 1< N < 100 );随后的 N(N-1)/2 行对应村庄间道路的成本及修建状态,每行给4个正整数,分别是两个村庄的编号(从1编号到N),此两村庄间道路的成本,以及修建状态:1表示已建,0表示未建。当N为0时输入结束。
3.解题思路
这个题和前面的差不多,就是加了一个状态,因此我们可以先判断每条路的状态,如果是修好的,就让它们的成本是0;如果没修,就让成本给出的成本。这样问题的处理就和前一题一样了。
4.感想
还是畅通工程啊
5.代码
#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
#define inf 0x3f3f3f3f
int map[100][100];
int s[100],vis[100];
int n,m;
int prim()
{
int i,j,t,p,min,cnt,minpos;
int ans=0;
cnt=0;
vis[1]=1;
s[cnt++]=1;
while(cnt<n)
{
t=cnt;
min=inf;
for(i=0;i<t;i++)
{
p=s[i];
for(j=1;j<=n;j++)
{
if(!vis[j]&&map[p][j]<min)
{
min=map[p][j];
minpos=j;
}
}
}
ans+=min;
s[cnt++]=minpos;
vis[minpos]=1;
}
return ans;
}
int main()
{
int i,sum;
while(~scanf("%d",&n)&&n)
{
memset(vis,0,sizeof(vis));
memset(map,inf,sizeof(map));
int b,c,d,sta;
m=n*(n-1)/2;
for(i=0;i<m;i++)
{
scanf("%d%d%d%d",&b,&c,&d,&sta);
if(sta==0)
map[b][c]=map[c][b]=d;
else
map[b][c]=map[c][b]=0;
}
sum=prim();
printf("%d\n",sum);
}
return 0;
}
- 2016sdau课程练习专题三 1005
- 2016sdau课程练习专题三 1001
- 2016sdau课程练习专题三 1011
- 2016sdau课程练习专题三 1010
- 2016sdau课程练习专题三 1012
- 2016sdau课程练习专题三 1013
- 2016sdau课程练习专题三 1014
- 2016sdau课程练习专题三 1015
- 2016sdau课程练习专题三 1006
- 2016sdau课程练习专题三 1016
- 2016sdau课程练习专题三 1002
- 2016sdau课程练习专题三 1008
- 2016sdau课程练习专题三 1004
- 2016sdau课程练习专题三 1017
- 2016sdau课程练习专题三 1003
- 2016sdau课程练习专题三 1004
- 2016sdau课程练习专题三 1009
- 2016sdau课程练习专题三 1011
- 解读PHP数组排序
- iOS开发英汉术语对照(二)
- FPGA基础知识11(FPGA异步复位同步释放解析)
- 大文件下载的实现
- 归并排序
- 2016sdau课程练习专题三 1005
- 反射与内省
- Java中的equals和hashCode方法详解
- 51nod1295 XOR key
- WCF安全机制之自定义账号密码
- 最长回文子串
- Javascript继承机制
- 初识python之简单方便及一些注意事项
- VS2015下Log4Cplus编译及其使用