hdoj3371Connect the Cities
2015-08-13 19:04
323 查看
Connect the Cities
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 13720 Accepted Submission(s): 3710
Problem Description
In 2100, since the sea level rise, most of the cities disappear. Though some survived cities are still connected with others, but most of them become disconnected. The government wants to build some roads to connect all of these cities
again, but they don’t want to take too much money.
Input
The first line contains the number of test cases.
Each test case starts with three integers: n, m and k. n (3 <= n <=500) stands for the number of survived cities, m (0 <= m <= 25000) stands for the number of roads you can choose to connect the cities and k (0 <= k <= 100) stands for the number of still connected
cities.
To make it easy, the cities are signed from 1 to n.
Then follow m lines, each contains three integers p, q and c (0 <= c <= 1000), means it takes c to connect p and q.
Then follow k lines, each line starts with an integer t (2 <= t <= n) stands for the number of this connected cities. Then t integers follow stands for the id of these cities.
Output
For each case, output the least money you need to take, if it’s impossible, just output -1.
Sample Input
1 6 4 3 1 4 2 2 6 1 2 3 5 3 4 33 2 1 2 2 1 3 3 4 5 6
Sample Output
1prim:#include<stdio.h> #include<string.h> #define INF 0x3f3f3f #define max 500+10 int visit[max],map[max][max],low[max],used[max]; int city,road,connect,n; void prim() { int i,j,next; int min,mincost=0; for(i=1;i<=city;i++) { visit[i]=0; low[i]=map[1][i]; } visit[1]=1; for(i=2;i<=city;i++) { min=INF; next=1; for(j=1;j<=city;j++) //寻找距离最近的点 { if(!visit[j]&&min>low[j]) { min=low[j]; next=j; } } if(min==INF) { printf("-1\n"); return ; } visit[next]=1; mincost+=min; for(j=1;j<=city;j++)//更新路径 { if(!visit[j]&&map[next][j]<low[j]) low[j]=map[next][j]; } } printf("%d\n",mincost); } int main() { int t,i,j,x,y,c; scanf("%d",&t); while(t--) { scanf("%d%d%d",&city,&road,&connect); for(i=1;i<=city;i++) { for(j=1;j<=city;j++) { if(i==j) map[i][j]=0; else map[i][j]=INF; } } while(road--) { scanf("%d%d%d",&x,&y,&c); if(map[x][y]>c) map[x][y]=map[y][x]=c; } while(connect--) { scanf("%d",&n); for(i=0;i<n;i++) scanf("%d",&used[i]); for(i=0;i<n;i++) { for(j=i+1;j<n;j++) { map[used[i]][used[j]]=map[used[j]][used[i]]=0; } } } prime(); } return 0; }
相关文章推荐
- Loadrunner常见错误解决
- 这就是传说中让理科生沉默,让文科生落泪的文史综合题【转】
- 黑马程序员——Foundation框架字典、集合类、反射
- 2015-8-13模拟赛总结
- 手写一个节点大小平衡树(SBT)模板,留着用
- 斯坦福ML公开课笔记15—隐含语义索引、奇异值分解、独立成分分析
- 求无向图的割点 (poj 1144 Network)
- [转载] 从Hadoop到Spark的架构实践
- 求无向图的割点 (poj 1144 Network)
- Hadoop相关基础知识
- mac os 下的sublime --- 快捷键
- HDU_4731 Minimum palindrome(找规律)
- 深入理解java的finalize
- 斯坦福ML公开课笔记14——主成分分析
- hdu3695(AC自动机)
- Eclipse ADT的Custom debug keystore所需证书规格
- laravel 5 sentinel(权限管理包)安装笔记
- SOAPUI 数据源设置
- Mongdb安全和认证
- VS2005调节主界面时,界面上的控件,以及(tab control中的)子界面上的控件一起缩放