hdu2122
#include<stdlib.h> #include<string.h> #include<stdio.h> #include<math.h> #include<queue> #define MAXN 1005 using namespace std; int root[MAXN]; struct edge{ int head; int tail; int cost; friend bool operator< (const edge &e1,const edge &e2){ return e1.cost > e2.cost; } }; priority_queue<edge> qn; int findroot(int index){ if(root[index] == -1) return index; else return root[index] = findroot(root[index]); } int kruskal(){ int count; edge ebuf; count=0; while(!qn.empty()){ ebuf = qn.top(); qn.pop(); int bufroot1 = findroot(ebuf.head); int bufroot2 = findroot(ebuf.tail); if(bufroot1 != bufroot2){ root[bufroot1] = bufroot2; count+=ebuf.cost; } } return count; } int main(){ int i; int n; int m; int u,v,cost,complete; edge edgebuf; freopen("in.txt","r",stdin); freopen("out.txt","w",stdout); while(scanf("%d",&n)!=EOF){ for(i=0;i<n;i++){ root[i]=-1; } scanf("%d",&m); for(i=0;i<m;i++){ scanf("%d %d %d",&u,&v,&cost); edgebuf.head = u; edgebuf.tail = v; edgebuf.cost = cost; qn.push(edgebuf); } int costbuf = kruskal(); int count; count=0; for(i=0;i<n;i++){ if(root[i] == -1) count++; } if(count == 1) printf("%d\n\n",costbuf); else printf("impossible\n\n"); } return 0; }