hdu4738(割桥)

找人去炸边,炸完之后分成两个连通块(炸割桥)

每条边上有w个守卫,派去炸桥的人不能比守卫少

所以,

如果原本不连通,那么输出0

如果没有桥,输出-1

如果有桥没有守卫,那么是输出1,而不是0(trick)

 1 #pragma warning(disable:4996)
 2 #pragma comment(linker, "/STACK:1024000000,1024000000")
 3 #include <iostream>
 4 #include <stdio.h>
 5 #include <string.h>
 6 #include <vector>
 7 #include <stack>
 8 #include <queue>
 9 #include <math.h>
10 #include <algorithm>
11 #include <map>
12 #include <set>
13 #include <functional>
14 using namespace std;
15 const int INF = 1 << 30;
16 typedef __int64 LL;
17 /*
18 要摧毁的边只能是桥
19
20 */
21
22 const int N = 1000 + 10;
23 int head[N], next[N*N], to[N*N], dist[N*N], e;
24 int dfn[N], low[N], dfs_clock, ans;
25 void init()
26 {
27     memset(head, -1, sizeof(head));
28     memset(dfn, 0, sizeof(dfn));
29     memset(low, 0, sizeof(low));
30     dfs_clock = e = 0;
31     ans = INF;
32 }
33 void addEdge(int u, int v, int dis)
34 {
35     to[e] = v;
36     dist[e] = dis;
37     ::next[e] = head[u];
38     head[u] = e++;
39 }
40 void tarjan(int u, int fa)
41 {
42     dfn[u] = low[u] = ++dfs_clock;
43     bool flag = false;
44     for (int i = head[u]; i + 1; i = ::next[i])
45     {
46         if (to[i] == fa && !flag)
47         {
48             flag = true;
49             continue;
50         }
51         if(dfn[to[i]]==0)
52             tarjan(to[i], u);
53         low[u] = min(low[to[i]], low[u]);
54         if (low[to[i]] > dfn[u])
55             ans = min(ans, dist[i]);
56     }
57 }
58 int main()
59 {
60     int n, m;
61     while (scanf("%d%d", &n, &m),n+m)
62     {
63         int u, v, dis;
64         init();
65         for (int i = 1;i <= m;++i)
66         {
67             scanf("%d%d%d", &u, &v, &dis);
68             addEdge(u, v, dis);
69             addEdge(v, u, dis);
70         }
71         ans = INF;
72         tarjan(1, -1);
73         bool flag = true;
74         for (int i = 1;i <= n;++i)
75             if (dfn[i] == 0)
76             {
77                 printf("0\n");
78                 flag = false;
79                 break;
80             }
81         if (!flag)continue;
82         if (ans == INF)
83             ans = -1;
84         if (ans == 0)ans = 1;
85         printf("%d\n", ans);
86     }
87     return 0;
88 }
时间: 2024-10-08 02:47:26

hdu4738(割桥)的相关文章

【最小割】HDU 4971 A simple brute force problem.

说是最大权闭合图.... 比赛时没敢写.... 题意 一共有n个任务,m个技术 完成一个任务可盈利一些钱,学习一个技术要花费钱 完成某个任务前需要先学习某几个技术 但是可能在学习一个任务前需要学习另几个任务 求最多能赚多少钱咯 先将缩点将需要一起学掉的技术缩成一个点 建s--任务 权值为该任务盈利多少钱 建技术(缩点后)-t 权值为学习这技术的花费(总) 任务-技术 (完成该任务所需的每个技术都需要建边)权值为INF #include<stdio.h> #include<stdlib.h

UVA 315 求割点数

题目链接:http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=251 测模版: #include <stdio.h> #include <iostream> #include <algorithm> #include <string.h> #include <queue> #includ

luogu题解 P3388 【【模板】割点(割顶)】

外加定义:在一个无向图中,如果删掉点 x 后图的连通块数量增加,则称点 x 为图的割点. 外加图示 开始思路为割桥上的点为割点,后来证明的确正确. 不过可惜的是他的逆定理错了(gg了),不过数据很弱以至于得了90分. 如图所示 图中无割桥,但点3却是割点,貌似无法解决. (顺及客串my blog ,以及图论的必要工具 回归正题,另一种思路诞生了: 如果u点的子节点为v,v点他能返回的最老祖先比u点年轻或一样(即dfn[u]值<=low[v]),那么如果删去u点,那么v以下的点就会与v以上的点失去

Codeforces 104C Cthulhu dfs暴力 || 双连通缩点

题目链接:点击打开链接 题意: 给定n个点m条边的无向图 问图中是否存在 有且仅有一个简单环和一些树,且这些树的root都在这个简单环上. 瞎写了个点双..== #include <stdio.h> #include <iostream> #include <algorithm> #include <string.h> #include <queue> #include <vector> #include <set> us

强连通

一.模板 (1)tarjan模板 1 #define N 30100 2 //N为最大点数 3 #define M 150100 4 //M为最大边数 5 int n, m;//n m 为点数和边数 6 7 struct Edge{ 8 int from, to, nex; 9 bool sign;//是否为桥 10 }edge[M<<1]; 11 int head[N], edgenum; 12 void add(int u, int v){//边的起点和终点 13 Edge E={u, v

POJ 3114 Countries in War 强连通+最短路

用floyd超时了...注定的事情...题意:看案例就跑出来了..不需要看题了把.. #include<stdio.h> #include<string.h> #include<algorithm> using namespace std; #include<vector> const int INF =1999299; int minn(int a,int b) { return a>b?b:a; } #define N 510 #define M

hdu - 3594 Cactus (强连通)

http://acm.hdu.edu.cn/showproblem.php?pid=3594 判断给定的图是否是强连通的,并且每条边都只属于一个连通分量. 判断强连通只需要判断缩点之后顶点数是否为1即可, 然后在缩点的过程中,如果已经产生环,并且当前结点的父节点还有父节点,则必定有多个环, 最后还要判断每个结点都要只属于一个联通分量,否则不符合要求. 1 #include <iostream> 2 #include <cstdio> 3 #include <cmath>

hdu - 2667 Proving Equivalences(强连通)

http://acm.hdu.edu.cn/showproblem.php?pid=2767 求至少添加多少条边才能变成强连通分量.统计入度为0的点和出度为0的点,取最大值即可. 1 #include <iostream> 2 #include <cstdio> 3 #include <cmath> 4 #include <vector> 5 #include <cstring> 6 #include <algorithm> 7 #i

hdu - 1269 迷宫城堡 (强连通裸题)

http://acm.hdu.edu.cn/showproblem.php?pid=1269 判断一个图是不是强连通,缩点之后判断顶点数是不是为1即可. 1 #include <iostream> 2 #include <cstdio> 3 #include <cmath> 4 #include <vector> 5 #include <cstring> 6 #include <algorithm> 7 #include <st