题意:
n总共有多少个城市;
m:有多少条路;
k:相连的城市有多少组。
对于K:输入2是表示有两组城市有已建好的路
再输入一个T 表示 这T个城市相连。几map值 为0;
连接:http://acm.hdu.edu.cn/showproblem.php?pid=3371
View Code
#include <iostream> using namespace std; #define INF 0x7ffffff #define MAX 500+10 int n,m,k; int map[MAX][MAX]; int used[MAX]; int dis[MAX]; int sum; int step[MAX]; int type; void Prim() { memset(used,0,sizeof(used)); for(int i=1;i<=n;i++) { dis[i]=INF; } dis[1]=0; for(i=1;i<=n;i++) { int min=INF; int index; for(int j=1;j<=n;j++) { if(!used[j]&&dis[j]<min) { min=dis[j]; index=j; } } sum+=dis[index]; used[index]=1; for(j=1;j<=n;j++) { if(map[index][j]!=-1&&dis[j]>map[index][j]) { dis[j]=map[index][j]; } } } for(i=1;i<=n;i++)//找是否每个点都走过 { if(!used[i]) { type=0; break; } } return; } int main() { int x; while(scanf("%d",&x)!=EOF) { while(x--) { scanf("%d%d%d",&n,&m,&k); memset(map,-1,sizeof(map)); for(int i=1;i<=m;i++) { int a; int b; int c; scanf("%d%d%d",&a,&b,&c); if(map[a][b]>c||map[a][b]==-1) { map[a][b]=c; map[b][a]=c; } } int t; while(k--) { scanf("%d",&t); for(int i=1;i<=t;i++) { scanf("%d",&step[i]); } for(i=1;i<=t;i++) { for(int j=1;j<=t;j++) { map[step[i]][step[j]]=0; } } } sum=0; type=1; Prim(); if(!type) { printf("-1\n"); } else printf("%d\n",sum); } } return 0; }