标签:
这题很显然用最小生成树来做。不过要稍微变化一下,一开始我打算用一个布尔数组来标记哪些村庄之间已经用道路连接,可是我发现写起来有点费劲,于是突然想到如果把已经修建的道路想象成0是不是就可以呢,仔细想了一下,貌似真的可以,提交之后果然过了。
#include<cstdio> #include<iostream> #include<cstring> #include<algorithm> #include<stack> #include<queue> 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; }
标签:
原文地址:http://blog.csdn.net/u013621213/article/details/43456861