这题很显然用最小生成树来做。不过要稍微变化一下,一开始我打算用一个布尔数组来标记哪些村庄之间已经用道路连接,可是我发现写起来有点费劲,于是突然想到如果把已经修建的道路想象成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;
}