1348:【例4-9】城市公交网建设问题
时间限制: 1000 ms 内存限制: 65536 KB
提交数: 5034 通过数: 1748
【题目描述】
有一张城市地图,图中的顶点为城市,无向边代表两个城市间的连通关系,边上的权为在这两个城市之间修建高速公路的造价,研究后发现,这个地图有一个特点,即任一对城市都是连通的。现在的问题是,要修建若干高速公路把所有城市联系起来,问如何设计可使得工程的总造价最少?
【输入】
n(城市数,1<≤n≤100)
e(边数)
以下e行,每行3个数i,j,wiji,j,wij,表示在城市i,j之间修建高速公路的造价。
【输出】
n-1行,每行为两个城市的序号,表明这两个城市间建一条高速公路。
【输入样例】
5 8
1 2 2
2 5 9
5 4 7
4 1 10
1 3 12
4 3 6
5 3 3
2 3 8
【输出样例】
1 2
2 3
3 4
3 5
呵,毕业考结束了,我来做题写题解了。
有点时间没写了,以后一天3篇吧,把图这一章搞好。
这道题完全模板题,思路是kruskal算法。
代码奉上:
#include <bits/stdc++.h>//kruskal算法
using namespace std;
int n,e,fa[105],tot;
struct edge
{
int u,v,w;
} a[10050];
struct nedge
{
int u,v;
} b[105];
bool cmp(edge x,edge y) //cmp函数,排序用,排边长
{
return x.w<y.w;
}
int find(int x) //查找
{
if(x==fa[x]) return x;
return fa[x]=find(fa[x]);
}
void unionn(int x,int y) //连接
{
int x9=find(x),y9=find(y);
if(x9!=y9) fa[y9]=x9;//只有100,懒得优化合并
}
bool cmp2(nedge x,nedge y) //排序用,排最终答案
{
if(x.u!=y.u) return x.u<y.u;
return x.v<y.v;
}
int main()
{
cin>>n>>e;
for(int i=1; i<=e; i++)
{
scanf("%d%d%d",&a[i].u,&a[i].v,&a[i].w);//输入
if(a[i].u>a[i].v) swap(a[i].u,a[i].v);//为输出做准备
}
for(int i=1; i<=n; i++) fa[i]=i; //初始化
sort(a+1,a+e+1,cmp);//排序
for(int i=1; i<=e&&tot<n-1; i++) //连接
{
int x=find(a[i].u),y=find(a[i].v);//根结点
if(x!=y)
{
unionn(x,y);//连接
b[++tot].u=a[i].u;
b[tot].v=a[i].v;//存放
}
}
sort(b+1,b+n,cmp2);//排序
for(int i=1; i<n; i++)
printf("%d %d\n",b[i].u,b[i].v);//输出
return 0;
}
代码简单,我不多讲,我得去写新文章去了。