/*
zoj_1542 最小生成树
题意:找最小生成树,然后找其中的最大边
很水的一道题,输出也不用排序什么。。不过我完全不知道sample到底什么意思。。
随便交了下,居然过了。。不想去纠结题意了。。
*/
#include <iostream>
#include <cstdio>
#include <queue>
using namespace std;
struct node
{
int from,to,len;
};
priority_queue <node>pq;
int re[1010][2],maxi,rei,count;
int father[1010];
bool operator<( const node&a,const node&b )
{
return a.len>b.len;
}
int find_set( int a )
{
if( a!=father[a] )
{
father[a]=find_set( father[a] );
}
return father[a];
}
void union_set( int a,int b,int value )
{
int aa,bb;
aa=find_set(a);
bb=find_set(b);
if( aa==bb ) return;
father[bb]=aa;
re[rei][0]=a;
re[rei++][1]=b;
count++;
if( maxi<value ) maxi=value;
}
int main()
{
int n,m,i;
node temp;
while( scanf( "%d%d",&n,&m )!=EOF )
{
for( i=0;i<=n;i++ ) father[i]=i;
for( i=0;i<m;i++ )
{
scanf( "%d%d%d",&temp.from,&temp.to,&temp.len );
pq.push( temp );
}
maxi=-1; count=0; rei=0;
while( !pq.empty() )
{
temp=pq.top(); pq.pop();
union_set( temp.from,temp.to,temp.len );
}
printf( "%d\n%d\n",maxi,count );
for( i=0;i<rei;i++ )
printf( "%d %d\n",re[i][0],re[i][1] );
}
return 0;
}
zoj 1542
最新推荐文章于 2015-08-10 17:02:33 发布