题目:http://acm.hdu.edu.cn/showproblem.php?pid=4738

坑点:

  1. 处理重边
  2. 图可能不连通,要输出0
  3. 若求出的结果是0,则要输出1,因为最少要派一个人
 #include<bits/stdc++.h>
using namespace std;
const int maxn = ;
const int inf = 0x3f3f3f3f;
struct edge{
int to,cost;
};
vector<edge> g[maxn];
int num[maxn],low[maxn],index;
int res;
int mp[maxn][maxn];//处理两点之间边的条数
//tarjan
void tarjan(int cur,int father){
index++;
num[cur] = index;
low[cur] = index;
for(int i = ;i<g[cur].size();i++){
if(num[g[cur][i].to] == ){
tarjan(g[cur][i].to,cur);
low[cur] = min(low[g[cur][i].to],low[cur]);
if(low[g[cur][i].to] > num[cur] && mp[cur][g[cur][i].to] == )
res = min(res,g[cur][i].cost);
}else if(g[cur][i].to != father){
low[cur] = min(low[cur],num[g[cur][i].to]);
}
}
}
//并查集判断连通性
int f[maxn];
int getf(int x){
if(f[x] == x){
return x;
}else{
return f[x] = getf(f[x]);
}
}
int merge(int l,int r){
int a = getf(l);
int b = getf(r);
if(a != b){
f[a] = b;
}
}
// 初始化
void init(int n){
index = ;
res = inf;
memset(num,,sizeof(num));
memset(low,,sizeof(low));
memset(mp,,sizeof(mp));
for(int i = ;i<=n;i++){
g[i].clear();
f[i] = i;
}
}
int main(){
int n,m;
while(scanf("%d%d",&n,&m) && n && m){
init(n);
int a,b,c;
while(m--){
scanf("%d%d%d",&a,&b,&c);
g[a].push_back(edge{b,c});
g[b].push_back(edge{a,c});
merge(a,b);
mp[a][b]++;
mp[b][a]++;
}
int flag = ;
for(int i = ;i<=n;i++)
if(getf(i) != getf()){
flag = ;
break;
}
if(flag){
puts("");
continue;
}
tarjan(,);
if(res == )
res++;
if(res == inf)
puts("-1");
else
printf("%d\n",res);
}
return ;
}

割边模板:

 #include<bits/stdc++.h>
using namespace std;
const int maxn = ;
const int inf = 0x3f3f3f3f;
struct edge{
int to,cost;
};
vector<edge> g[maxn];
int num[maxn],low[maxn],index;
//tarjan
void tarjan(int cur,int father){
index++;
num[cur] = index;
low[cur] = index;
for(int i = ;i<g[cur].size();i++){
if(num[g[cur][i].to] == ){
tarjan(g[cur][i].to,cur);
low[cur] = min(low[g[cur][i].to],low[cur]);
if(low[g[cur][i].to] > num[cur])
//u-v为割边
}else if(g[cur][i].to != father){
low[cur] = min(low[cur],num[g[cur][i].to]);
}
}
}
// 初始化
void init(int n){
memset(num,,sizeof(num));
memset(low,,sizeof(low));
for(int i = ;i<=n;i++){
g[i].clear();
}
}

割点模板:

 const int maxn = ;
const int inf = 0x3f3f3f3f;
struct edge{
int to,cost;
};
vector<edge> g[maxn];
int num[maxn],low[maxn],index;
//tarjan
void tarjan(int cur,int father){
int child = ;
index++;
num[cur] = index;
low[cur] = index;
for(int i = ;i<g[cur].size();i++){
if(num[g[cur][i].to] == ){
child++;
tarjan(g[cur][i].to,cur);
low[cur] = min(low[g[cur][i].to],low[cur]);
if(low[g[cur][i].to] >= num[cur] && cur!=root)
//cur为割点
if(cur==root && child>=)
//cur为割点
}else if(g[cur][i].to != father){
low[cur] = min(low[cur],num[g[cur][i].to]);
}
}
}
// 初始化
void init(int n){
memset(num,,sizeof(num));
memset(low,,sizeof(low));
for(int i = ;i<=n;i++){
g[i].clear();
}
}

HDU4738 tarjan割边|割边、割点模板的更多相关文章

  1. Tarjan缩点割点(模板)

    描述:https://www.luogu.com.cn/problem/P3387 给定一个 nn 个点 mm 条边有向图,每个点有一个权值,求一条路径,使路径经过的点权值之和最大.你只需要求出这个权 ...

  2. Tarjan无向图的割点和桥(割边)全网详解&算法笔记&通俗易懂

    更好的阅读体验&惊喜&原文链接 感谢@yxc的腿部挂件 大佬,指出本文不够严谨的地方,万分感谢! Tarjan无向图的割点和桥(割边) 导言 在掌握这个算法前,咱们有几个先决条件. [ ...

  3. hihoCoder 1183 连通性一·割边与割点(Tarjan求割点与割边)

    #1183 : 连通性一·割边与割点 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 还记得上次小Hi和小Ho学校被黑客攻击的事情么,那一次攻击最后造成了学校网络数据的丢 ...

  4. Tarjan在图论中的应用(二)——用Tarjan来求割点与割边

    前言:\(Tarjan\) 求割点和割边建立在 \(Tarjan\)算法的基础之上,因此建议在看这篇博客之前先去学一学\(Tarjan\). 回顾\(Tarjan\)中各个数组的定义 首先,我们来回顾 ...

  5. Tarjan的学习笔记 求割边求割点

    博主图论比较弱,搜了模版也不会用... 所以决心学习下tarjan算法. 割点和割边的概念不在赘述,tarjan能在线性时间复杂度内求出割边. 重要的概念:时间戟,就是一个全局变量clock记录访问结 ...

  6. tarjan求割边割点

    tarjan求割边割点 内容及代码来自http://m.blog.csdn.net/article/details?id=51984469 割边:在连通图中,删除了连通图的某条边后,图不再连通.这样的 ...

  7. Tarjan算法与割点割边

    目录 Tarjan算法与无向图的连通性 1:基础概念 2:Tarjan判断割点 3:Tarjan判断割边 Tarjan算法与无向图的连通性 1:基础概念 在说Tarjan算法求解无向图的连通性之前,先 ...

  8. hihoCoder #1183 : 连通性一·割边与割点(求割边与各点模板)

    #1183 : 连通性一·割边与割点 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 还记得上次小Hi和小Ho学校被黑客攻击的事情么,那一次攻击最后造成了学校网络数据的丢 ...

  9. HihoCoder 1183 : 连通性一·割边与割点(模板)

    连通性一·割边与割点 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 还记得上次小Hi和小Ho学校被黑客攻击的事情么,那一次攻击最后造成了学校网络数据的丢失.为了避免再次 ...

随机推荐

  1. [C]指针有什么好处?

    指针的好处,需要和数组比较起来说.具体如下:     1.指针可以随意申请不连续的数据存储空间,而数组是连续的,如果数组空间没有全部占用,那么会造成浪费,比如你申请了a[10],缺只有5个数据输入,那 ...

  2. UOJ #221 【NOI2016】 循环之美

    题目链接:循环之美 这道题感觉非常优美--能有一个这么优美的题面和较高的思维难度真的不容易-- 为了表示方便,让我先讲一下两个符号.\([a]\)表示如果\(a\)为真,那么返回\(1\),否则返回\ ...

  3. [LeetCode] Longest Increasing Subsequence 最长递增子序列

    Given an unsorted array of integers, find the length of longest increasing subsequence. For example, ...

  4. [LeetCode] 3Sum 三数之和

    Given an array S of n integers, are there elements a, b, c in S such that a + b + c = 0? Find all un ...

  5. [LeetCode] Longest Palindromic Substring 最长回文串

    Given a string S, find the longest palindromic substring in S. You may assume that the maximum lengt ...

  6. functools模块

    from functools import wraps def logged(func):     @wraps(func)     def with_logging(*args, **kwargs) ...

  7. 使用Hibernate的 isNotEmpty( ) 方法 报错: No result defined .... and result dataAccessFailure

    数据访问失败 出错代码: cardy.add(Restrictions.isNotEmpty("grade.cardtype.cardtype")); try...catch之后发 ...

  8. 关于List的ConcurrentModificationException

    对ArrayList的操作我们可以通过索引象来访问,也可以通过Iterator来访问,只要不对ArrayList结构上进行修改都不会造成ConcurrentModificationException, ...

  9. volatile修饰符

    Volatile 修饰的成员变量在每次被线程访问时,都强制从共享内存中重新读取该成员变量的值.而且,当成员变量发生变化时,会强制线程将变化值回写到共享内存.这样在任何时刻,两个不同的线程总是看到某个成 ...

  10. C#面向对象设计模式纵横谈——2.Singleton 单件(创建型模式)

    一:模式分类 从目的来看: 创建型(Creational)模式:负责对象创建. 结构型(Structural)模式:处理类与对象间的组合. 行为型(Behavioral)模式:类与对象交互中的职责分配 ...