poj 1861(最小生成树)
辣鸡题,样例给的都不对,就是最小生成树
#include <iostream> #include <cstring> #include <algorithm> #include <cstdio> #include <queue> using namespace std; const int maxn=1000+100; const int maxm=15000+100; int n,m; int c[maxn]; struct note { int u; int v; int len; bool operator <(const note &p) const { return len >p.len; } }aa[maxm]; priority_queue<note> q; void init() { while(q.size()) q.pop(); for(int i=0;i<=n;i++) c[i]=i; } int found(int x) { if(x==c[x]) return x; else return c[x]=found(c[x]); } bool same(int x,int y) { return found(x)==found(y); } void unit(int x,int y) { x=found(x); y=found(y); if(x==y) return; c[x]=y; } int main() { while(~scanf("%d%d",&n,&m)) { init(); int u,v,len; for(int i=1;i<=m;i++) { scanf("%d%d%d",&u,&v,&len); q.push(note{u,v,len}); } int ans=0,cnt=0,maxi=0; while(q.size()) { note nn=q.top(); q.pop(); if(!same(nn.u,nn.v)) { unit(nn.u,nn.v); ans+=nn.len; cnt++; aa[cnt].u=nn.u; aa[cnt].v=nn.v; maxi=max(maxi,nn.len); } } printf("%d\n",maxi); printf("%d\n",cnt); for(int i=1;i<=cnt;i++) printf("%d %d\n",aa[i].u,aa[i].v); } return 0; }