城市公交网建设问题

    xiaoxiao2022-07-05  154

    题目描述

    有一张城市地图,图中的顶点为城市,无向边代表两个城市间的连通关系,边上的权为在这两个城市之间修建高速公路的造价,研究后发现,这个地图有一个特点,即任一对城市都是连通的。现在的问题是,要修建若干高速公路把所有城市联系起来,问如何设计可使得工程的总造价最少?

    输入

    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 #include<bits/stdc++.h> #define read() freopen("input.txt","r",stdin) #define write() freopen("output.txt","w",stdout) using namespace std; const int maxn = 1e5+10; struct dot{ int start,end,len; }city[maxn],res[maxn]; int pre[maxn]; int find(int x){ return x==pre[x]?x:pre[x]=find(pre[x]); } void init(){ for( int i=0; i<maxn; i++ ) pre[i]=i; } bool cmp(dot a,dot b){ return a.len<b.len; } bool cmp2(dot a,dot b){ if(a.start!=b.start) return a.start<b.start; return a.end<b.end; } int main(){ int d=0,n,m;cin>>n>>m; for( int i=0; i<m; i++ ) cin>>city[i].start>>city[i].end>>city[i].len; init(); sort(city,city+m,cmp); for( int i=0; i<m; i++ ){ int v1=find(city[i].start); int v2=find(city[i].end); if(v1!=v2){ res[d].start=min(city[i].start,city[i].end);res[d++].end=max(city[i].end,city[i].start); pre[v1]=v2; } } sort(res,res+d,cmp2); for( int i=0; i<d; i++ ) cout<<res[i].start<<' '<<res[i].end<<'\n'; return 0; }
    最新回复(0)