HDU 1879 (最小生成树)

来源:互联网 发布:编程五大原理 编辑:程序博客网 时间:2024/05/23 19:10


#include <cstdio>#include <cmath>#include <cstring>#include <cstdlib>#include <algorithm>using namespace std;int cnt=0;struct node{int a,b,tag;int cost;}Node[5010];int cmp (const node &a,const node &b){return a.cost < b.cost;}//----并查集操作----int bleg[102];int find (int x){int y=x;while (y != bleg[y])y = bleg[y];while (x != bleg[x]){int px = bleg[x];bleg[x] = y;x = px;}return y;}void Union (int a,int b){int pa=find (a),pb=find(b);if (pa != pb)   //非回路统计cnt++;if (rand() & 1)bleg[pa] = pb;elsebleg[pb] = pa;}void init (int n){for (int i=1;i<=n;i++)bleg[i] = i;}//===========================/* 1.把已经存在道路的两个村庄加入到一个集合v中 2.对所有的道路的长短从小到大排序 3.筛选出没有道路联通并且也没有间接联通的节点i加入到集合v中。(可以确定i是最小的) 4.重复3步骤直到v中有n-1条边或没有节点可加。*/int main (){#ifndef ONLINE_JUDGEfreopen ("in.txt","r",stdin);#endifint n;while (~scanf ("%d",&n) && n){int a,b,cost,tag;int len = n*(n-1)/2;cnt = 0;init (n);for (int i=0;i<len;i++){scanf ("%d%d%d%d",&a,&b,&cost,&tag);Node[i].a=a,Node[i].b=b,Node[i].cost=cost,Node[i].tag=tag;if (Node[i].tag)  //如果i节点的a b两个村庄之间存在道路Union (Node[i].a,Node[i].b);  //那么他们就已经 连在一起。}sort (Node,Node+len,cmp);int sum = 0;bool flag=false;//--------------for (int i=0;i<len;i++){if (cnt==n-1) break;//if (!Node[i].tag) //若i节点中的a b两个村庄不存在直接的道路if (find(Node[i].a) == find(Node[i].b)) //但他们之间是间接相通的continue;else {Union (Node[i].a,Node[i].b);sum += Node[i].cost;}}//printf ("flag == %d\n",flag);if (cnt==n-1)printf ("%d\n",sum);elseputs ("0");}return 0;}

wa了多次的代码:


#include <cstdio>#include <cmath>#include <cstring>#include <cstdlib>#include <algorithm>using namespace std;int cnt=0;struct node{int a,b,tag;int cost;}Node[5010];int cmp (const node &a,const node &b){return a.cost < b.cost;}//----并查集操作----int bleg[102];int find (int x){int y=x;while (y != bleg[y])y = bleg[y];while (x != bleg[x]){int px = bleg[x];bleg[x] = y;x = px;}return y;}void Union (int a,int b){int pa=find (a),pb=find(b);if (pa != pb)   //非回路统计cnt++;if (rand() & 1)bleg[pa] = pb;elsebleg[pb] = pa;}void init (int n){for (int i=0;i<n;i++)bleg[i] = i;}//===========================/* 1.把已经存在道路的两个村庄加入到一个集合v中 2.对所有的道路的长短从小到大排序 3.筛选出没有道路联通并且也没有间接联通的节点i加入到集合v中。(可以确定i是最小的) 4.重复3步骤直到v中有n-1条边或没有节点可加。*/int main (){#ifndef ONLINE_JUDGEfreopen ("in.txt","r",stdin);#endifint n;while (~scanf ("%d",&n) && n){int a,b,cost,tag;int len = n*(n-1)/2;cnt = 0;init (n);for (int i=0;i<len;i++){scanf ("%d%d%d%d",&a,&b,&cost,&tag);Node[i].a=a,Node[i].b=b;  //=======bleg是错位的的,但是a b并没有错位 -1。Node[i].cost=cost,Node[i].tag=tag;if (Node[i].tag)  //如果i节点的a b两个村庄之间存在道路Union (Node[i].a,Node[i].b);  //那么他们就已经 连在一起。}sort (Node,Node+len,cmp);int sum = 0;bool flag=false;//--------------for (int i=0;i<len;i++){if (cnt==n-1) break;//if (!Node[i].tag) //若i节点中的a b两个村庄不存在直接的道路if (find(Node[i].a) == find(Node[i].b)) //但他们之间是间接相通的continue;else {Union (Node[i].a,Node[i].b);sum += Node[i].cost;}}//printf ("flag == %d\n",flag);if (cnt==n-1)printf ("%d\n",sum);elseputs ("0");}return 0;}


0 0
原创粉丝点击