#include <stdio.h>
#include <string.h>
//最小生成树,或并查集
#define MAX 0x7ffffff
#define LEN 105
int dist[LEN];
int map[LEN][LEN];
int isvisited[LEN];
//prim算法
int prim(int n){
int i,j,min,pos;
int sum=0;
memset(isvisited,0,sizeof(isvisited));
//初始化
for(i=1;i<=n;i++){
dist[i]=map[1][i];
}
//从1开始
isvisited[1]=1;
dist[1]=MAX;
//找到权值最小点并记录下位置
for(i=1;i<n;i++){
min=MAX;
//pos=-1;
for(j=1;j<=n;j++){
if(!isvisited[j] && dist[j]<min){
min=dist[j];
pos=j;
}
}
sum+=dist[pos];//加上权值
isvisited[pos]=1;
//更新权值
for(j=1;j<=n;j++){
if(!isvisited[j] && dist[j]>map[pos][j]){
dist[j]=map[pos][j];
}
}
}
return sum;
}
int main()
{
int n,i,j,a,b,d,m;
while(scanf("%d",&n)!=EOF)
{
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
{
scanf("%d",&d);
map[i][j]=map[j][i]=d;
}
scanf("%d",&m);
for (i=1;i<=m;i++)
{//已经修过的路,权值为0
scanf("%d %d",&a,&b);
map[a][b]=0;
map[b][a]=0;
}
printf("%d\n",prim(n));
}
return 0;
}
hdu1102 Constructing Roads
最新推荐文章于 2021-05-15 15:15:25 发布