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
1
题意:已知若干路径和已经有联系的城市,求最小花费使所有城市相连
注意:必须使用c语言的输入输出,否则会超时
#include <iostream> #include <memory.h> #include <stdio.h> #define INF 0x3f3f3f3f #define NUM 505 using namespace std; int n; bool vis[NUM]; int lowcost[NUM]; int g[NUM][NUM]; int Prim() { int ans=0; memset(vis,false,sizeof(vis)); memset(lowcost,INF,sizeof(lowcost)); for(int i=1;i<=n;i++) lowcost[i]=g[1][i]; vis[1]=true; lowcost[1]=0; for(int i=2;i<=n;i++) { int Min=INF; int k=-1; for(int j=1;j<=n;j++) { if(!vis[j]&&lowcost[j]<Min) { Min=lowcost[j]; k=j; } } if(Min==INF) return -1; ans+=Min; vis[k]=true; for(int j=1;j<=n;j++) { if(!vis[j]&&lowcost[j]>g[k][j]&&g[k][j]!=INF) { lowcost[j]=g[k][j]; } } } return ans; } int main() { int T; scanf("%d",&T); int m,k,t,a,b; int p,q,c; while(T--) { scanf("%d%d%d",&n,&m,&k); for(int i=1;i<=n;i++) { for(int j=1;j<=n;j++) { g[i][j]=INF; } } while(m--) { scanf("%d%d%d",&p,&q,&c); if(c<g[p][q]) g[p][q]=g[q][p]=c; } while(k--) { scanf("%d%d",&t,&a); t=t-1; while(t--) { scanf("%d",&b); g[a][b]=g[b][a]=0; } } int ans=Prim(); printf("%d\n",ans); } return 0; }