题意:已知N点间的距离,若有M条路已建(a,b之间是通路),求还需建多长的路,输出路的最小值。
对于M条路已建(a,b之间是通路)这一条件,只需令f[a][b] = f[b][a] = 0;
解决掉这个问题,就按prim 模板即可。
#include<stdio.h>
#include<string.h>
#define INf 0x7ffffff
int n,m;
int f[105][105],vis[105],dis[105];
int prim()
{
int i,j,k,t,r;
for(i = 1;i <= n;i ++)
{
dis[i] = INf;
}
dis[1] =0;
for(i = 1;i <= n;i ++)
{
t = INf;
for(j = 1;j <= n;j ++)
{
if(!vis[j] && dis[j]<t)
{
t = dis[j];
k = j;
}
}
vis[k] = 1;
for(j = 1;j <= n;j ++)
{
if(dis[j] > f[k][j] && !vis[j])
dis[j] = f[k][j];
}
}
r = 0;
for(i = 1;i <= n;i ++)
{
r += dis[i];
}
return r;
}
int main()
{
int i,j,k,a,b;
while(~scanf("%d",&n))
{
memset(vis,0,sizeof(vis));
for(i = 1;i <= n;i ++)
{
for(j = 1;j <= n;j ++)
{
scanf("%d",&f[i][j]);
}
}
scanf("%d",&m);
while(m --)
{
scanf("%d %d",&a,&b);
f[a][b] = 0;
f[b][a] = 0;
}
k = prim();
printf("%d\n",k);
}
return 0;
}