标签:
input | output |
---|---|
6 3 4 1 2 2 3 4 5 1 3 3 4 4 6 5 6 |
2 |
#include <iostream> #include <cstring> #include <cstdio> #include <cstring> #include <algorithm> #include <cmath> #include <time.h> #include <string> #include <map> #include <stack> #include <vector> #include <set> #include <queue> #define inf 0x3f3f3f3f #define mod 10000 typedef long long ll; using namespace std; const int N=10005; const int M=100005; struct Edg { int v,u; int w; } edg[M]; bool cmp(Edg g,Edg h) { return g.w<h.w; } int n,m,maxn,cnt,k; int parent[N]; int a[N]; void init() { for(int i=0; i<n; i++)parent[i]=i; } void Build() { int u,v; while(k--){ scanf("%d%d",&u,&v); edg[++cnt].u=u; edg[cnt].v=v; edg[cnt].w=0; } while(m--){ scanf("%d%d",&u,&v); edg[++cnt].u=u; edg[cnt].v=v; edg[cnt].w=1; } sort(edg,edg+cnt+1,cmp); } int Find(int x) { if(parent[x] != x) parent[x] = Find(parent[x]); return parent[x]; } void Union(int x,int y) { x = Find(x); y = Find(y); if(x == y) return; parent[y] = x; } void Kruskal() { int sum=0; int num=0; int u,v; for(int i=0; i<=cnt; i++) { u=edg[i].u; v=edg[i].v; if(Find(u)!=Find(v)) { sum+=edg[i].w; num++; Union(u,v); } if(num>=n-1) { printf("%d\n",sum); break; } } } int main() { scanf("%d%d%d",&n,&k,&m); if(m==0)printf("0\n"),exit(0); if(n==1)printf("0\n"),exit(0); cnt=-1; init(); Build(); Kruskal(); return 0; }
URAL(timus) 1272 Non-Yekaterinburg Subway(最小生成树)
标签:
原文地址:http://www.cnblogs.com/jianrenfang/p/5857984.html