HDU 1863 畅通工程
并查集+最小生成树
#include<cstdio> #include<cmath> #include<cstring> #include<algorithm> using namespace std; const int M=124; const int N=124*124; int fa[M]; int m,n; int find(int x) { if(fa[x]!=x) fa[x]=find(fa[x]); return fa[x]; } struct node { int s,t,w; }edge[N]; void init() { for(int i=1;i<=m;i++) fa[i]=i; } int cmp(const node &a,const node &b) { return a.w<b.w; } int main() { int i; while(~scanf("%d%d",&n,&m)) { if(n==0) break; for(i=0;i<n;i++) { scanf("%d%d%d",&edge[i].s,&edge[i].t,&edge[i].w); } init(); sort(edge,edge+n,cmp); int ans=0; for(i=0;i<n;i++) { int u=find(edge[i].s); int v=find(edge[i].t); if(u!=v) { fa[u]=v; ans+=edge[i].w; m--; } } if(m>1) printf("?\n"); else printf("%d\n",ans); } return 0; }

浙公网安备 33010602011771号