练习四 1001

来源:互联网 发布:杭州真趣网络 编辑:程序博客网 时间:2024/04/30 09:46


题意:
给出n个城市间的距离,和m对已经联通的城市,问最少需要建设多少道路把所有城市联通。
思路:
最小生成树问题,注意在把城市之间的距离转化成邻接表时避免超时,把已经联通的城市合并。
只需要取矩阵中j>i的部分。
代码:
#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
int p[10010],n,m,k;
struct road
{
int s,e,w;
}r[10010];
bool cmp(road a,road b)
{ return a.w<b.w; }
int find(int x)
{ return p[x]==x?x:p[x]=find(p[x]); }
int kru()
{
int sum=0;
for(int i=0;i<k;i++)
{
int x=find(r[i].s),y=find(r[i].e);
if(x!=y)
{
p[x]=y;
sum+=r[i].w;
}
}
return sum;
}
int main()
{
while(cin>>n){
k=0;
for(int i=1;i<=n;i++)
{
p[i]=i;
for(int j=1;j<=n;j++)
{
int q;
cin>>q;
if(j>i)
{
r[k].s=i;
r[k].e=j;
r[k].w=q;
k++;
}
}
}
cin>>m;
while(m--)
{
int x,y;
cin>>x>>y;
x=find(x);
y=find(y);
if(x!=y) p[x]=y;
}
sort(r,r+k,cmp);
cout<<kru()<<endl;
}
return 0;
}4 1001
题意:
给出n个城市间的距离,和m对已经联通的城市,问最少需要建设多少道路把所有城市联通。
思路:
最小生成树问题,注意在把城市之间的距离转化成邻接表时避免超时,把已经联通的城市合并。
只需要取矩阵中j>i的部分。
代码:
#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
int p[10010],n,m,k;
struct road
{
int s,e,w;
}r[10010];
bool cmp(road a,road b)
{ return a.w<b.w; }
int find(int x)
{ return p[x]==x?x:p[x]=find(p[x]); }
int kru()
{
int sum=0;
for(int i=0;i<k;i++)
{
int x=find(r[i].s),y=find(r[i].e);
if(x!=y)
{
p[x]=y;
sum+=r[i].w;
}
}
return sum;
}
int main()
{
while(cin>>n){
k=0;
for(int i=1;i<=n;i++)
{
p[i]=i;
for(int j=1;j<=n;j++)
{
int q;
cin>>q;
if(j>i)
{
r[k].s=i;
r[k].e=j;
r[k].w=q;
k++;
}
}
}
cin>>m;
while(m--)
{
int x,y;
cin>>x>>y;
x=find(x);
y=find(y);
if(x!=y) p[x]=y;
}
sort(r,r+k,cmp);
cout<<kru()<<endl;
}
return 0;
}
0 0
原创粉丝点击