题目链接:https://vjudge.net/contest/241341#problem/D
这里有多个发电站,需要求出所有点都和发电站直接或间接相连的最小代价,那么就是求出最小生成树的问题了,有点细微的不同是我们一开始要把所有的发电站看成起点(看成一个点),把其他点到发电站的最小代价求出,之后就是模板题了。
代码:
#include<iostream> #include<cstring> using namespace std; const int inf=0x3f3f3f; int map[300][300],vis[300],ss[300],dis[300]; int n,m,k,t,ans; void prime() { for(int i=1;i<=k;i++)//多加了一层循环,遍历所有发电站 { for(int j=1;j<=n;j++) { dis[j]=min(dis[j],map[ss[i]][j]); } } for(int i=1;i<n;i++) { int min1=inf,u=0; for(int j=1;j<=n;j++) { if(!vis[j]&&dis[j]<min1) { min1=dis[j]; u=j; } } if(u==0) //结束 return; vis[u]=1; ans+=min1; for(int j=1;j<=n;j++) { if(!vis[j]&&dis[j]>map[u][j]) { dis[j]=map[u][j]; } } } } int main() { cin>>t; int count1=0; while(t--) { cin>>n>>m>>k; memset(vis,0,sizeof(vis)); int u,v,w; memset(dis,0x3f,sizeof(dis)); memset(map,0x3f,sizeof(map)); for(int i=1;i<=k;i++) { cin>>ss[i]; //ss数组用来保存发电站 vis[ss[i]]=1; //标记为已经走过 dis[ss[i]]=0; //自己到自己为0 } for(int i=1;i<=m;i++) { cin>>u>>v>>w; if(map[u][v]>w) map[u][v]=map[v][u]=w; } ans=0; prime(); cout<<"Case #"<<++count1<<": "<<ans<<endl; } return 0; }