思路:求最小生成树,prim 算法,注意将已经修过的路的权值置为0。
#include<stdio.h>
int map[101][101],p[101],dist[101];
int main()
{
int i,j,k,n,m,a,b,min,len;
while(~scanf("%d",&n))
{
for(i = 0;i < n;i ++)
{
for(j = 0;j < n;j ++)
scanf("%d",&map[i][j]);
}
scanf("%d",&m);
for(i = 0;i < m;i ++)
{
scanf("%d%d",&a,&b);
map[a-1][b-1] = map[b-1][a-1] = 0;
}
for(i = 0;i < n;i ++)
{
p[i] = 0;
dist[i] = map[0][i];
}
len = dist[0] = 0;
p[0] = 1;
for(i = 1;i < n;i ++)
{
min = 1010;
k = 0;
for(j = 0;j < n;j ++)
{
if(!p[j]&&dist[j]<min)
{
min = dist[j];
k = j;
}
}
len += min;
p[k] = 1;
for(j = 0;j < n;j ++)
{
if(!p[j]&&dist[j]>map[k][j])
dist[j] = map[k][j];
}
}
printf("%d\n",len);
}
return 0;
}