题目: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. 新手!mass 设置问题

    mass就是你那个物体的质量啊质量越大,惯性也越大重力也越大.假如你的刚体的mass为1,那么你只要给这个物体9.81N向上的力,你就可以抵消重力,让这个物体悬浮着:但假如这个物体的mass为10,你 ...

  2. 利用线上数据验证系统 Gor

    Web 应用性能和压力测试工具 Gor - 运维生存时间 http://hao.jobbole.com/gorhttp/ 要使用线上引流到测试环境的作用,需要做到以下几点: 1.新搭建一套测试环境,连 ...

  3. TypeScript 素描 - 类

    本文虽然是学自官方教程而来,但是也融入了自己的理解,而且对官方的例子做了一些修改 /* 类 面向对象编程的一大核心 使用C#.Java进行编程的朋友肯定已经是不能够再熟悉了 TypeScript的类与 ...

  4. neo4j初次使用学习简单操作-cypher语言使用

    Neo4j 使用cypher语言进行操作 Cypher语言是在学习Neo4j时用到数据库操作语言(DML),涵盖对图数据的增删改查  neo4j数据库简单除暴理解的概念: Neo4j中不存在表的概念, ...

  5. String 字符串

    多行字符串: http://php.net/manual/zh/language.types.string.php#language.types.string.syntax.nowdoc DEMO: ...

  6. ORB-SLAM(六)回环检测

    上一篇提到,无论在单目.双目还是RGBD中,追踪得到的位姿都是有误差的.随着路径的不断延伸,前面帧的误差会一直传递到后面去,导致最后一帧的位姿在世界坐标系里的误差有可能非常大.除了利用优化方法在局部和 ...

  7. OBS-Studio二次开发记录

    OBS-Studio 是一款跨平台的,开源的视频直播客户端软件. 公司需要对他进行二次开发,开发的目的是使用它的录屏功能. 开发的要求是:定制全新的界面,所见即所得,window系统兼容要好. 开发步 ...

  8. EF增删库查

    public async Task<bool> Add(fu_ocrresult model) { using (var db = new GENEModel()) { //1.将实体对象 ...

  9. java编码

    /**     * @Comments:default:ISO-8859-1 -> UTF-8 乱码则转码     * @param: str(乱码字符),coding(default:ISO- ...

  10. 关于input的file框onchange事件触发一次失效的新的解决方法

    在google了众多方法后,网上有这么几种方法: 1.替换掉原来的input框 2.remove原来的input框,然后在添加进新的一样的input框 但是不知道为什么非常不幸的是,怎么弄我都弄不出. ...