并查集+最小生成树
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 15844 Accepted Submission(s):
6028
#include<stdio.h>
#include<algorithm>
int set[110];
using namespace std;
struct record
{
int a;
int b;
int ju;
}s[200000];
int find(int fa)
{
int ch=fa;
int t;
while(fa!=set[fa])
fa=set[fa];
while(ch!=fa)
{
t=set[ch];
set[ch]=fa;
ch=t;
}
return fa;
}
void mix(int x,int y)
{
int fx,fy;
fx=find(x);
fy=find(y);
if(fx!=fy)
set[fx]=fy;
}
bool cmp(record a,record b)
{
return a.ju<b.ju;
}
int main()
{
int n,m,j,i,sum,ju1,village,k,q,v1,v2;
while(scanf("%d",&village)!=EOF)
{
k=0;m=0;
for(i=0;i<=village;i++)
{
set[i]=i;
}
for(i=1;i<=village;i++) //注意此处应从1开始,因为没有0号城市
{
for(j=1;j<=village;j++)
{
scanf("%d",&ju1);
if(j>i) //此循环计入了所有的两个城市组合之间的距离
{ //以及对应城市编号
s[k].a=i;
s[k].b=j;
s[k].ju=ju1;
k++;
}
}
}
sort(s,s+k,cmp);
scanf("%d",&q);
for(i=0;i<q;i++)
{
scanf("%d%d",&v1,&v2);
mix(v1,v2);
}
sum=0;
for(i=0;i<k;i++)
{
if(find(s[i].a)!=find(s[i].b))
{
mix(s[i].a,s[i].b);
sum+=s[i].ju;
}
}
printf("%d\n",sum);
}
return 0;
}
原文:http://www.cnblogs.com/tonghao/p/4470553.html