题目: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. vs2015 编译时错误列表中没有错误,dll却没有生成出来

    最近发现vs2015的一个问题, 编译时,错误列表中没有错误,dll却没有生成出来,vs重启也无效 解决: 多次排查发现如果一个类库设置的是framework 4.0版本,但引用了framework4 ...

  2. [LeetCode] Palindrome Permutation II 回文全排列之二

    Given a string s, return all the palindromic permutations (without duplicates) of it. Return an empt ...

  3. SQL Server-5种常见的约束

    引自:http://www.cnblogs.com/dekevin/p/4772235.html SQLServer 中有五种约束, Primary Key 约束. Foreign Key 约束. U ...

  4. 远程桌面时plsql的复制粘贴功能失效

    解决办法:重新启动远程桌面上的rdpclip进程就可以复制粘贴了,但是每次重开远程桌面都会出现同样的问题.可以rdpclip这个设置成开机启动.

  5. Spring Boot

    Spring Boot是由Pivotal团队提供的全新框架,其设计目的是用来简化新Spring应用的初始搭建以及开发过程.该框架使用了特定的方式来进行配置,从而使开发人员不再需要定义样板化的配置.通过 ...

  6. Android基础测试题(四)

    看了前两道题大家有没有发现,测试题少了(一),大家猜猜测试题(一)是什么? Android基础测试题(四): 需求: 建一个方法,格式化输出2016-11-14 10:15:26格式的当前时间,然后截 ...

  7. python_java_selenium_ jenkins持续集成Firfox_chrome浏览器不显示的解决方法?

    python_java_selenium_ jenkins持续集成Firfox_chrome浏览器不显示的解决方法: 原因:因为jenkins是用windows installer 安装成 windo ...

  8. js修改伪类的值

    css文件 p.change:after { content: attr(data-content); } js文件 $(this).addClass('change').attr('data-con ...

  9. POJ 1797 Heavy Transportation(最大生成树/最短路变形)

    传送门 Heavy Transportation Time Limit: 3000MS   Memory Limit: 30000K Total Submissions: 31882   Accept ...

  10. 基于Dubbo框架构建分布式服务(一)

    Dubbo是Alibaba开源的分布式服务框架,我们可以非常容易地通过Dubbo来构建分布式服务,并根据自己实际业务应用场景来选择合适的集群容错模式,这个对于很多应用都是迫切希望的,只需要通过简单的配 ...