题意:
有多个供电站和村庄,问最少需要多少花费可以使所有村庄通上电。
题解:
刚开始不知道该怎么做,后来想了想,直接把供电站先加入到最小生成树里,(供电站之间的边权值为0)。很简单,裸题。
#include<iostream> #include<cstdio> #include<cstring> #include<algorithm> using namespace std; const int maxn=205,INF=0x3f3f3f3f; int cost[maxn][maxn]; int mincost[maxn]; bool used[maxn]; int n,m,k; int a[maxn]; int prim() { for(int i=1;i<=n;i++) { mincost[i]=INF; used[i]=false; } mincost[1]=0; int res=0; while(1) { int v=-1; for(int u=1;u<=n;u++) { if(!used[u]&&(v==-1||mincost[u]<mincost[v])) v=u; } if(v==-1) break; used[v]=true; res+=mincost[v]; for(int u=1;u<=n;u++) mincost[u]=min(mincost[u],cost[u][v]); } return res; } int main() { int t,cas=0; cin>>t; while(t--) { cin>>n>>m>>k; for(int i=1;i<=n;i++) for(int j=1;j<=n;j++) cost[i][j]=INF; for(int i=0;i<k;i++) cin>>a[i]; for(int i=0;i<m;i++) { int a,b,c; cin>>a>>b>>c; cost[a][b]=cost[b][a]=c; } for(int i=0;i<k;i++) for(int j=i+1;j<k;j++) { cost[a[i]][a[j]]=cost[a[j]][a[i]]=0; } printf("Case #%d: %d ",++cas,prim()); } return 0; }