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
- HDU 1879 最小生成树
- HDU 1879 最小生成树
- HDU 1879 (最小生成树)
- HDU 1879 最小生成树
- HDU 1879 最小生成树
- hdu 1879 最小生成树【prime算法】
- HDU-1879(prim构最小生成树)
- HDU 1879 最小生成树 prim + kruskal
- hdu 1879 最小生成树 prim
- hdu 1879 简单最小生成树
- hdu 1879 裸最小生成树
- HDU-1836 最小生成树
- hdu 1863 最小生成树
- hdu 1233 最小生成树
- hdu 4081 最小生成树
- hdu 1863 最小生成树
- HDU-1162(最小生成树)
- hdu 1233 最小生成树
- OCP 1Z0 051 168
- 黑马程序员_010布局的练习计算机器界面
- 对static的一点理解
- Java 加密 base64 encode
- JavaScript权威指南第03章 类型、值和变量(2)
- HDU 1879 (最小生成树)
- plsql乱码 windows下配置环境变量,修改注册表
- 使用ADO.NET对SQL Server数据库进行访问
- dojo 学习笔记之dojo.query - query(id) 与query(class)的区别
- boost sparse matrix row and column
- Team Management Skills
- Qt绘制图片
- 河南省第七届ACM大赛成绩
- 友情相惜,无关爱情