题目链接:http://poj.org/problem?id=2421
题意:求连通各个村所所需建造最短路的长度,并且有些路已经存在,有些还需要建造,题目求最少需要建造多长的路
输入
N
N×N的矩阵
Q
Q行,每行两点表示:起点、终点
做法:
把已经存在的边
#include<cstdio>
#include<algorithm>
const int N=20010;
int parent[N];
struct Edge
{
int s,e,dis;
bool operator<(const Edge &b)const{
return dis<b.dis;
}
}edge[N];
int find(int x){
return x==parent[x]?x:find(parent[x]);
}
int kruskal(int n)
{
int ans=0;
std::sort(edge,edge+n);
for(int i=0;i<n;++i){
int x=find(edge[i].s);
int y=find(edge[i].e);
if(x!=y){
ans+=edge[i].dis;
parent[y]=x;
}
}
return ans;
}
int main()
{
int n,dis,k;
while(~scanf("%d",&n)){
k=0;
for(int i=1;i<=n;++i)
for(int j=1;j<=n;++j){
scanf("%d",&dis);
if(j>i){
edge[k].s=i;
edge[k].e=j;
edge[k].dis=dis;
k++;
edge[k].e=i;
edge[k].s=j;
edge[k].dis=dis;
}
}
for(int i=0;i<N;++i)parent[i]=i;
int m;
scanf("%d",&m);
while(m--){
int s,e;
scanf("%d %d",&s,&e);
s=find(s);
e=find(e);
parent[e]=s;
}
printf("%d\n",kruskal(k));
}
}
的起点、终点添加为一个祖先,表示该边已经被添加