3 1 2 1 0 1 3 2 0 2 3 4 0 3 1 2 1 0 1 3 2 0 2 3 4 1 3 1 2 1 0 1 3 2 1 2 3 4 1 0
3 10
代码:
#include<cstdio> #include<cstring> #include<cstdlib> #include<algorithm> using namespace std; int pre[105]; struct node { int p1; int p2; int v; } way[5000]; int m,n; void init() { memset(pre,0,sizeof(pre)); memset(way,0,sizeof(way)); for(int i=1;i<=n;i++) pre[i]=i; } int cmp(node a,node b) { return a.v<b.v; } int find(int x) { int ret=x; while(pre[ret]!=ret) ret=pre[ret]; int t=x,r; while(t!=ret) { r=pre[t]; pre[t]=ret; t=r; } return ret; } int join(int x,int y) { int fx=find(x); int fy=find(y); if(fx!=fy)//这里做了一个优化,每次保证较大的点当做父节点,把较小的并入到大的中 { if(fx<fy) pre[fy]=fx; else pre[fx]=fy; return 1; } return 0; } void Kruskal() { int ans=0; for(int i=0;i<m;i++) if(join(way[i].p1,way[i].p2)) ans+=way[i].v; printf("%d\n",ans); } int main() { while(scanf("%d",&n),n) { m=n*(n-1)/2; init(); for(int i=0;i<m;i++) { int a,b,v,flag; scanf("%d%d%d%d",&a,&b,&v,&flag); way[i].p1=a; way[i].p2=b; if(flag) way[i].v=0; else way[i].v=v; } sort(way,way+m,cmp); Kruskal(); } return 0; }