Constructing Roads(1102 最小生成树 prim)
2015-12-12 12:51
295 查看
Constructing Roads
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 18256 Accepted Submission(s): 6970
[align=left]Problem Description[/align]
There are N villages, which are numbered from 1 to N, and you should build some roads such that every two villages can connect to each other. We say two village A and B are connected, if and only if there is a road between A and B, or there exists a village C such that there is a road between A and C, and C and B are connected.
We know that there are already some roads between some villages and your job is the build some roads such that all the villages are connect and the length of all the roads built is minimum.
[align=left]Input[/align]
The first line is an integer N (3 <= N <= 100), which is the number of villages. Then come N lines, the i-th of which contains N integers, and the j-th of these N integers is the distance (the distance should be an integer within [1, 1000]) between village i and village j.
Then there is an integer Q (0 <= Q <= N * (N + 1) / 2). Then come Q lines, each line contains two integers a and b (1 <= a < b <= N), which means the road between village a and village b has been built.
[align=left]Output[/align]
You should output a line contains an integer, which is the length of all the roads to be built such that all the villages are connected, and this value is minimum.
[align=left]Sample Input[/align]
3
0 990 692
990 0 179
692 179 0
1
1 2
[align=left]Sample Output[/align]
179
#include <cstdio> #include <algorithm> #include <iostream> #include <cstring> using namespace std; #define INF 0x3f3f3f3f int map[105][105]; int n,q,a,b; int res; int mincost[105]; int vis[105]; void prim() { mincost[1]=0; while(true) { int v=-1; int u; for(u=1;u<=n;u++) { if(!vis[u]&&(v==-1||mincost[u]<mincost[v])) v=u; } if(v==-1) break; vis[v]=1; res+=mincost[v]; for(u=1;u<=n;u++) mincost[u]=min(map[v][u],mincost[u]); } return; } int main() { int i,j; freopen("in.txt","r",stdin); while(scanf("%d",&n)!=EOF) { res=0; fill(mincost,mincost+105,INF); memset(vis,0,sizeof(vis)); for(i=1;i<=n;i++) for(j=1;j<=n;j++) scanf("%d",&map[i][j]); scanf("%d",&q); for(i=0;i<q;i++) { scanf("%d%d",&a,&b); map[a][b]=map[b][a]=0; } prim(); printf("%d\n",res); } }
相关文章推荐
- eclispe快捷键
- Android编程之软键盘的隐藏显示实例详解
- C++ 函数传参
- swift 的 UIAlertController使用
- 图片搜索引擎 - WebCrawler
- 二、三栏布局(左右宽度固定,中间自适应宽度)
- 杭电2111Saving HDU(贪心)
- Log4j2介绍和特性实例(一)
- Count and Say
- Count and Say
- 一种基于java的web动态安全漏洞检测方法
- 计算两个日期之间的天数
- php创建多级目录
- Java的事件自定义事件学习
- C 溢出
- 电子发票将全覆盖清障电商征税
- PHP级联删除文件
- 飞思卡尔Kinetis芯片中NVIC模块的中断寄存器的介绍及其应用举例
- Vijos P1001谁拿了最多奖学金
- 为方便管理Maven中的模块,Maven提供了聚合与继承来管理