1348:【例4-9】城市公交網(wǎng)建設(shè)問題
時(shí)間限制: 1000 ms ??? ??? 內(nèi)存限制: 65536 KB
提交數(shù): 5034 ??? 通過數(shù): 1748
【題目描述】
有一張城市地圖,圖中的頂點(diǎn)為城市,無向邊代表兩個(gè)城市間的連通關(guān)系,邊上的權(quán)為在這兩個(gè)城市之間修建高速公路的造價(jià),研究后發(fā)現(xiàn),這個(gè)地圖有一個(gè)特點(diǎn),即任一對城市都是連通的?,F(xiàn)在的問題是,要修建若干高速公路把所有城市聯(lián)系起來,問如何設(shè)計(jì)可使得工程的總造價(jià)最少?
【輸入】
n(城市數(shù),1<≤n≤100)
e(邊數(shù))
以下e行,每行3個(gè)數(shù)i,j,wiji,j,wij,表示在城市i,j之間修建高速公路的造價(jià)。
【輸出】
n-1行,每行為兩個(gè)城市的序號,表明這兩個(gè)城市間建一條高速公路。
【輸入樣例】
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
呵,畢業(yè)考結(jié)束了,我來做題寫題解了。
有點(diǎn)時(shí)間沒寫了,以后一天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函數(shù),排序用,排邊長
{
? 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,懶得優(yōu)化合并
}
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);//為輸出做準(zhǔn)備
? }
? 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);//根結(jié)點(diǎn)
? ? 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;
}
代碼簡單,我不多講,我得去寫新文章去了。