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