這題很顯然用最小生成樹來做。不過要稍微變化一下,一開始我打算用一個布爾數組來標記哪些村莊之間已經用道路連接,可是我發現寫起來有點費勁,於是突然想到如果把已經修建的道路想象成0是不是就可以呢,仔細想了一下,貌似真的可以,提交之後果然過了。
#include#include #include #include #include #include using namespace std; const int N=102; const int inf=1<<28; int vill[N][N],mincost[N]; bool used[N]; int n,q; void solve() { fill(mincost,mincost+N,inf); memset(used,false,sizeof(used)); mincost[1]=0; int cost=0; while(true) { int _min=inf,u=-1; for(int i=1;i<=n;i++) if(!used[i]&&_min>mincost[i]) _min=mincost[i],u=i; if(u==-1) break; used[u]=true; cost+=_min; for(int i=1;i<=n;i++) mincost[i]=min(mincost[i],vill[u][i]); } printf("%d\n",cost); } int main() { while(scanf("%d",&n)!=EOF) { for(int i=1;i<=n;i++) for(int j=1;j<=n;j++) scanf("%d",&vill[i][j]); scanf("%d",&q); int a,b; for(int i=1;i<=q;i++) { scanf("%d%d",&a,&b); vill[a][b]=vill[b][a]=0; } solve(); } return 0; }