1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43
| const int N=5007,M=2e5+7; int n,m; struct edges{ int u,v,w; edges(){ u=v=w=0; } edges(int U,int V,int W){ u=U,v=V,w=W; } bool operator <(const edges A) const { return w<A.w; } }e[M]; int best[N]; int p[N]; inline void init(int n){ for(int i=1;i<=n;i++) p[i]=i; } inline int find(int x){ return x!=p[x]?p[x]=find(p[x]):x; } int main(){ #ifndef ONLINE_JUDGE freopen("in.in","r",stdin); freopen("out.out","w",stdout); #endif rd(n,m); init(n); for(int i=1;i<=m;i++) rd(e[i].u,e[i].v,e[i].w); int ans=0,cnt=0; bool flag=1; while(flag){ flag=0; for(int i=1;i<=n;i++) best[i]=0; for(int i=1;i<=m;i++){ int x=find(e[i].u),y=find(e[i].v); if(x==y) continue; if(!best[x]||e[i].w<e[best[x]].w) best[x]=i; if(!best[y]||e[i].w<e[best[y]].w) best[y]=i; } for(int i=1;i<=n;i++){ if(best[i]){ int x=find(e[best[i]].u),y=find(e[best[i]].v); if(x==y) continue; cnt++,ans+=e[best[i]].w,flag=1,p[x]=y; } } } if(cnt==n-1) wt('\n',ans); else puts("orz"); return 0; }
|