这道题的题意貌似有点小难啊~
题目大意:一个组织要实现几个outposts(后称岗哨)之间的通信,每两个岗哨之间有transceiver(后称接收器)且距离少于D便可以实现通信。
我们要分清接收器(S)和岗哨(P),我的目的就是求出那个可以实现所有岗哨之间相互通信的最小的D。
其实岗哨数就是连通分支的个数,有多少个岗哨,就可以有多少个连通分支。
这样每去 掉一条边,我们就多了一个分支。那么我们就可以去掉s-1条最长边,得到s个连通分支。
(每个分支里有一个岗哨)剩下的最长边则为所求了。
所以,用PRIM和KRUSKAL都可以解决
Time Limit: 2000MS | Memory Limit: 65536K | |
Total Submissions: 7059 | Accepted: 2393 |
Description
Input
Output
Sample Input
1 2 4 0 100 0 300 0 600 150 750
Sample Output
212.13
#include <stdio.h> #include <stdlib.h> #include <algorithm> #include <string.h> using namespace std; const int M = 25003; int n,m; int father[M]; int num[M]; struct node{ int s,e,v; //bool visit; }edge[M]; bool cmp( node a , node b ) { return a.v < b.v; } int find( int x ) { return x == father[x] ? x : father[x] = find( father[x] ); } bool merge( int a , int b ) { int x,y; x = find( a ); y = find( b ); if( x == y ) return true; else father[x] = y; return false; } int main() { while( scanf("%d%d",&n,&m) == 2 ){ for( int i=1 ; i<=n ; i++ ) father[i] = i; for( int i=1 ; i<=m ; i++ ){ scanf("%d%d%d",&edge[i].s,&edge[i].e,&edge[i].v); } sort( edge+1 , edge+1+m , cmp ); int minn,l; l = minn = 0; for( int i=1 ; i<=m ; i++ ){ if( merge(edge[i].s , edge[i].e ) ) continue; else{ minn = edge[i].v; num[l++] = i; } } printf("%d\n%d\n",minn,l); for( int i=0 ; i<l ; i++ ) printf("%d %d\n",edge[num[i]].s,edge[num[i]].e); } return 0; }