hdu 1879 有的边已存在 (MST)

Sample Input
3
1 2 1 0 //u v w 是否已建
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

Sample Output
3
1
0

将已经建好的路的权值设为0

 1 # include <iostream>
 2 # include <cstdio>
 3 # include <cstring>
 4 # include <algorithm>
 5 # include <cmath>
 6 # define LL long long
 7 using namespace std ;
 8
 9 int n ;
10 const int MAXN=110;//最大点数
11 const int MAXM=10000;//最大边数
12 int F[MAXN];//并查集使用
13 struct Edge
14 {
15     int u,v,w;
16 }edge[MAXM];//存储边的信息,包括起点/终点/权值
17
18 int tol;//边数,加边前赋值为0
19 void addedge(int u,int v,int w)
20 {
21
22     edge[tol].u=u;
23     edge[tol].v=v;
24     edge[tol++].w=w;
25 }
26 bool cmp(Edge a,Edge b)
27 {//排序函数,讲边按照权值从小到大排序
28     return a.w<b.w;
29 }
30 int find(int x)
31 {
32     if(F[x]==-1)return x;
33     else return F[x]=find(F[x]);
34 }
35 int Kruskal()//传入点数,返回最小生成树的权值,如果不连通返回-1
36 {
37     memset(F,-1,sizeof(F));
38     sort(edge,edge+tol,cmp);
39     int cnt=0;//计算加入的边数
40     int ans=0;
41     for(int i=0;i<tol;i++)
42     {
43         int u=edge[i].u;
44         int v=edge[i].v;
45         int w=edge[i].w;
46         int t1=find(u);
47         int t2=find(v);
48         if(t1!=t2)
49         {
50             ans+=w;
51             F[t1]=t2;
52             cnt++;
53         }
54         if(cnt==n-1)break;
55     }
56     if(cnt<n-1)return -1;//不连通
57     else return ans;
58 }
59
60 int main()
61 {
62
63     //freopen("in.txt","r",stdin) ;
64     while(scanf("%d" , &n) != EOF)
65     {
66         if (n == 0)
67             break ;
68         int u , v , w , ok ;
69         int i ;
70         tol = 0 ;
71         for (i = 1 ; i <= n*(n-1)/2 ; i++)
72         {
73             scanf("%d %d %d %d" , &u , &v , &w , &ok) ;
74             if (ok == 1)
75                 addedge(u,v,0) ;
76             else
77                 addedge(u,v,w) ;
78         }
79         printf("%d\n" , Kruskal()) ;
80
81
82     }
83     return 0 ;
84 }

时间: 2024-08-28 03:30:58

hdu 1879 有的边已存在 (MST)的相关文章

HDU 1879 继续畅通工程

Description省政府“畅通工程”的目标是使全省任何两个村庄间都可以实现公路交通(但不一定有直接的公路相连,只要能间接通过公路可达即可).现得到城镇道路统计表,表中列出了任意两城镇间修建道路的费用,以及该道路是否已经修通的状态.现请你编写程序,计算出全省畅通需要的最低成本. Input测试输入包含若干测试用例.每个测试用例的第1行给出村庄数目N ( 1< N < 100 ):随后的 N(N-1)/2 行对应村庄间道路的成本及修建状态,每行给4个正整数,分别是两个村庄的编号(从1编号到N)

hdu 1879 继续畅通工程 (最小生成树)

继续畅通工程 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 12717    Accepted Submission(s): 5506 Problem Description 省政府"畅通工程"的目标是使全省任何两个村庄间都可以实现公路交通(但不一定有直接的公路相连,只要能间接通过公路可达即可).现得到城镇道路统计表,表中列出

hdu 1879 继续畅通工程 (并查集+最小生成树)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1879 继续畅通工程 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 14075    Accepted Submission(s): 6136 Problem Description 省政府“畅通工程”的目标是使全省任何两个村庄间都可以实现公

hdu 1879 最小生成树 kruskal

继续畅通工程 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 14910    Accepted Submission(s): 6458 Problem Description 省政府“畅通工程”的目标是使全省任何两个村庄间都可以实现公路交通(但不一定有直接的公路相连,只要能间接通过公路可达即可).现得到城镇道路统计表,表中列出了任意两城

hdu 1879 继续畅通工程 最小生成树入门模板题

继续畅通工程 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 15227    Accepted Submission(s): 6598 Problem Description 省政府"畅通工程"的目标是使全省任何两个村庄间都可以实现公路交通(但不一定有直接的公路相连,只要能间接通过公路可达即可).现得到城镇道路统计表,表中列

HDU - 1879 继续畅通工程(最小生成树)

d.n个村庄,n*(n-1)/2条路,建立一些路使所有村庄可达.求建立路这些路的最小花费. s.最小生成树 c.Prim算法:cost[a][b]和cost[b][a]都得赋值. /* Prim算法 Prim求MST 耗费矩阵cost[][],标号从0开始,0~n-1 返回最小生成树的权值,返回-1表示原图不连通 */ #include<iostream> #include<stdio.h> #include<string.h> using namespace std;

HDU 1710Binary Tree Traversals(已知前序中序,求后序的二叉树遍历)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1710 解题思路:可以由先序和中序的性质得到 : 先序的第一个借点肯定是当前子树的根结点, 那么在 中序中找到这个结点, 则这个结点左边的节点属于左子树, 右边的属于右子树.然后递归遍历就可以了. 样例: 9 1 2 4 7 3 5 8 9 6 4 7 2 1 8 5 9 3 6 7 4 2 8 9 5 6 3 1 如图: 因此,用深搜就能轻松解决了,注意DFS中的变量,以及向清楚DFS的条件,这题就

hdu 1879 继续畅通project

继续畅通project Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 13284    Accepted Submission(s): 5721 Problem Description 省政府"畅通project"的目标是使全省不论什么两个村庄间都能够实现公路交通(但不一定有直接的公路相连.仅仅要能间接通过公路可达就可以).

HDU 4126 Genghis Khan the Conqueror MST+树形dp

题意: 给定n个点m条边的无向图. 下面m行给出边和边权 下面Q个询问. Q行每行给出一条边(一定是m条边中的一条) 表示修改边权. (数据保证修改后的边权比原先的边权大) 问:修改后的最小生成树的权值是多少. 每个询问互相独立(即每次询问都是对于原图修改) 保证没有重边. 求:所有修改后的最小生成树权值的平均值. 思路: 首先跑一个最小生成树. 求得这个MST的权值 int mst; 对于每个询问(u.v,dis); 若(u,v) 不是MST上的边,则此时的权值就是 mst 否则我们断开树边(