HDU 6187 Destroy Walls

最大生成树。

仔细想想会发现和坐标并没有任何关系,$king$要到达任何地点,也就是说给出的图中不能有环,因此对原图求最大生成树,不在最大生成树上的边就是要删除的,而且数量最小,费用最小。

#include <iostream>
#include <cstdio>
#include <cstring>
#include <string>
#include <algorithm>
#include <vector>
#include <queue>
#include <stack>
#include <map>
#include <math.h>
#include <set>
#include <cmath>
using namespace std;

const int maxn = 100000 + 10;
int n, m;
int f[maxn];
struct Edge {
	int u;
	int v;
	int w;
}e[2 * maxn];

bool cmp(const Edge& a, const Edge& b) {
  return a.w > b.w;
}

int Find(int x) {
  if(x != f[x]) {
  	f[x] = Find(f[x]);
  }
  return f[x];
}

int main() {
  while(~scanf("%d%d", &n, &m)) {
  	int x, y;
  	for(int i = 1; i <= n; i ++) {
  	  scanf("%d%d", &x, &y);
  	}
  	for(int i = 0; i < m; i ++) {
  	  scanf("%d%d%d", &e[i].u, &e[i].v, &e[i].w);
  	}
  	sort(e, e + m, cmp);
  	for(int i = 1; i <= n; i ++) {
  	  f[i] = i;
  	}
  	int ans1 = 0;
  	long long ans2 = 0;
  	for(int i = 0; i < m; i ++) {
  	  int fa = Find(e[i].u);
  	  int fb = Find(e[i].v);
  	  if(fa == fb) {
  	  	ans1 ++;
  	  	ans2 += (long long)e[i].w;
  	  } else {
  	  	f[fa] = fb;
  	  }
  	}
  	printf("%d %lld\n", ans1, ans2);
  }
  return 0;
}
时间: 2024-10-16 05:48:56

HDU 6187 Destroy Walls的相关文章

HDU 6187 Destroy Walls (对偶图最小生成树)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6187 题意:有一个V个结点M条边的带边权无向平面图,有一个人在一个区域,要拆一些墙使得他可以到达任意一个区域,问最小花费. 解法: #include <bits/stdc++.h> using namespace std; const int maxn = 100010; const int maxm = 200010; struct edge{ int u,v,w; edge(){} bool

HDU 4940 Destroy Transportation system 规律题

答案只有2种情况,所以ans = rand()%2; if(ans)puts("happy") else puts("unhappy"); == 想过无源汇的网络流,还是比较麻烦的,然后没往下想... 设s点集有一些点, 多加一个点一定是y增加比较快_(:зゝ∠)_ 然后设s点集只有一个点 #include <cstdio> #include <map> #include <set> #include <algorithm&

hdu 4940 Destroy Transportation system(水过)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4940 Destroy Transportation system Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others) Total Submission(s): 21    Accepted Submission(s): 17 Problem Description Tom is a

HDU 4940 Destroy Transportation system(图论)

这道题目当时做的时候想的是,如果找到一个点他的d值之和大于 d+b值之和,就可以.竟然就这么过了啊.不过题解上还有一种做法,好像有点难.以后在补一补那种做法吧. Destroy Transportation system Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others) Total Submission(s): 289    Accepted Submission(s): 1

I - Destroy Walls (HDU - 6187)

- 题目大意 有一个V个结点M条边的带边权无向平面图,有一个人在一个区域,要拆一些墙使得他可以到达任意一个区域,问最小花费. - 解题思路 先开始想不通,看了别人突然恍然大悟,根据欧拉公式我们可以知道对于一个有k个连通分量的平面图的区域数r=E?V+k+1.那么那么对偶图生成树的边数为r?1=E?V+k,这些边也就是要删除的原图中的边,那么要留下的边数就是V?k这刚好就是原图每个连通分量生成树的边数之和.考虑保留原图每个连通分量的生成树,显然满足要求.题目要求花费最小,也就是留下的边权值最大,那

hdu 4940 Destroy Transportation system (无源汇上下界可行流)

Destroy Transportation system Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others)http://acm.hdu.edu.cn/showproblem.php?pid=4940 Problem Description Tom is a commander, his task is destroying his enemy’s transportatio

最短路(数据处理):HDU 5817 Ice Walls

Have you ever played DOTA? If so, you may know the hero, Invoker. As one of the few intelligence carries, Invoker has 10 powerful abilities. One of them is the Ice Wall: Invoker generates a wall of solid ice directly in front of him, and the bitter c

HDU 1692 Destroy the Well of Life-卡时间-(枚举+剪枝)

题意:有n口井,编号为1到n,打破第i口井需要p[i]的能量,但是只要井被打破里面的水会流到下一口井,只要一口井的井水w[i]多余一个上限l[i]会自动打破,求打破第n口井需要的最少的能量 分析:hdu 把它归为dp,想了一会发现找不到最优子结构,然后看题解--根本不是dp,只是一个剪枝的题.或许有dp的解法,如果哪位大神知道还请指教.解题思路一旦局限在一个框框内很危险啊 代码: #include<iostream> using namespace std; int t,n,ans,w[100

hdu 4940 Destroy Transportation system( 无源汇上下界网络流的可行流推断 )

题意:有n个点和m条有向边构成的网络.每条边有两个花费: d:毁坏这条边的花费 b:重建一条双向边的花费 寻找这样两个点集,使得点集s到点集t满足 毁坏全部S到T的路径的费用和 > 毁坏全部T到S的路径的费用和 + 重建这些T到S的双向路径的费用和. 思路1: watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center&quo