有些点城镇已经连通好了 但是我们在做的时候是求剩下的连通起来要花多少钱
我们可以依然把这些已经连通好的边放进我们将要连通的所有边中 不过花费是0
这样依旧求出的是最短路 注意找的是最短路
#include<stdio.h>
#include<stdlib.h>
int map[105][105];
struct haha
{
int view1;
int view2;
int value;
}e[30000+5];
int parent[10005];
int cmp(const void *a,const void *b)
{
return (*(struct haha *)a).value-(*(struct haha *)b).value;
}
int get_root(int x)
{
return x==parent[x]?x:get_root(parent[x]);
}
int join(int x,int y)
{
int root1,root2;
root1=get_root(x);
root2=get_root(y);
// printf("root1=%d root2=%d\n",root1,root2);
if(root1==root2) return 0;
else parent[root1]=root2;
return 1;
}
int main()
{
int i,j,n,k,x,y,c,ans;
while(scanf("%d",&n)!=EOF)
{
c=1;ans=0;
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
scanf("%d",&map[i][j]);
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
{
if(map[i][j])
{
e[c].view1=i;
e[c].view2=j;
e[c].value=map[i][j];
c++;
}
}
for(i=0;i<=102;i++)
parent[i]=i;
scanf("%d",&k);
i=c;
for(c;c<i+k;c++)
{
scanf("%d %d",&x,&y);
e[c].view1=x;
e[c].view2=y;
e[c].value=0;
}
// printf("%d",c);
qsort(e+1,c-1,sizeof(e[0]),cmp);
// for(i=1;i<c;i++)
// printf("value=%d\n",e[i].value);
// printf("c=%d\n",c);
for(i=1;i<c;i++)
{
// printf("i=%d:",i);
if(join(e[i].view1,e[i].view2))
{
ans=ans+e[i].value;
}
}
printf("%d\n",ans);
}
return 0;
}
关于PAT(Programming Ability Test)培训的报名~
hdu1102 很好的最小生成树克鲁斯卡尔算法
最新推荐文章于 2019-02-12 14:37:39 发布