hdu1102------------------------还是畅通工程
这道题还是用用prim,模板题。和1233畅通工程很类似。做1233时很顺手,做这道时,稍有不同。
题中说明,有些路已经修好,不用再修了。求还要最少修多长的路才能全部连通。kao,刚开始想想歪了,不知道怎么处理那些已经联好的路。又是用邻接矩阵,又是用并查集,相邻好几个代码。都不行,最后看了一眼宪哥的代码。看到他把相连接的两条路之间的距离置为0, 一下就明白了。一改,过了。 中的来说,没变,还是prim算法。
AC代码
#include<stdio.h>
#include<string.h>
int map[101][101];
int low[101];
int visit[101];
int n;
int prim()
{
int i,j,k,pos,min;
int result=0;
memset(visit,0,sizeof(visit));
pos=1;
visit[pos]=1;
for(i=1;i<=n;i++)
{
if(i!=pos)
{
low[i]=map[pos][i];
}
}
for(i=1;i<n;i++)
{
min=10000;
for(j=1;j<=n;j++)
{
if(!visit[j]&&min>low[j])
{
min=low[j];
pos=j;
}
}
result+=min;
visit[pos]=1;
for(j=1;j<=n;j++)
{
if(!visit[j]&&map[pos][j]<low[j])
low[j]=map[pos][j];
}
}
printf("%d\n",result);
return 0;
}
int main()
{
int i,j,k;
int q,a,b;
while(scanf("%d",&n)!=EOF)
{
for(i=1;i<=n;i++)
{
for(j=1;j<=n;j++)
scanf("%d",&map[i][j]);
}
scanf("%d",&q);
for(i=1;i<=q;i++)
{
scanf("%d%d",&a,&b);
map[a][b]=map[b][a]=0;
}
prim();
}
return 0;
}