图论 ---- CF700 C. Break Up(Tarjan找桥+枚举+思维)
题目链接
题目大意:
题目思路:
- 一开始我们看到点和边很小,并且才删两条边?我就想能不能枚举删除一条边然后看看再去看能不能再删除一条边使得不连通
- 那么第二条边肯定是桥了!!,就是删除第1条边之后的桥
- 那么我们枚举删除的第一条边找桥时间复杂度O(m×(n+m))O(m\times(n+m))O(m×(n+m))过不了
- 我们想想第一次枚举的边肯定是s→ts\rightarrow ts→t路径上面边,那么我们可以先找出一条路径然后再去枚举,我们知道路径最长n−1n-1n−1,复杂度就变成了O(n×(n+m))O(n\times (n+m))O(n×(n+m))这就可以过啦
AC code
#include <bits/stdc++.h>
#define mid ((l + r) >> 1)
#define Lson rt << 1, l , mid
#define Rson rt << 1|1, mid + 1, r
#define ms(a,al) memset(a,al,sizeof(a))
#define log2(a) log(a)/log(2)
#define lowbit(x) ((-x) & x)
#define IOS std::ios::sync_with_stdio(0); cin.tie(0); cout.tie(0)
#define INF 0x3f3f3f3f
#define LLF 0x3f3f3f3f3f3f3f3f
#define f first
#define s second
#define endl '\n'
using namespace std;
const int N = 2e6 + 10, mod = 1e9 + 9;
const int maxn = 500010;
const long double eps = 1e-5;
const int EPS = 500 * 500;
typedef long long ll;
typedef unsigned long long ull;
typedef pair<int,int> PII;
typedef pair<ll,ll> PLL;
typedef pair<double,double> PDD;
template<typename T> void read(T &x) {x = 0;char ch = getchar();ll f = 1;while(!isdigit(ch)){if(ch == '-')f*=-1;ch=getchar();}while(isdigit(ch)){x = x*10+ch-48;ch=getchar();}x*=f;
}
template<typename T, typename... Args> void read(T &first, Args& ... args) {read(first);read(args...);
}
int n, m;
vector<int> e;
struct Edge {int nxt, to, w, id;
}eg[maxn];
int head[1010], cnt;
int s, t, res;
inline void add(int from, int to, int val, int id) {eg[cnt] = {head[from],to,val,id};head[from] = cnt ++;
}
int dfn[1010], low[1010], tot, backtot;
int ans = 2e9 + 10;
PII inf={-1,-1};//................................
bool vis[maxn];
inline bool find_path(int u) {vis[u] = 1;for(int i = head[u]; ~i; i = eg[i].nxt) {int v = eg[i].to;if(vis[v]) continue;if(v == t) {e.push_back(i);return 1;}if(find_path(v)) {e.push_back(i);return 1;}}return 0;
}
//...............................
inline bool Tarjan(int u, int last) {dfn[u] = low[u] = ++tot;bool all = 0;for(int i = head[u]; ~i; i = eg[i].nxt) {int v = eg[i].to;if(eg[i].id == eg[res].id) continue;if(i == (1^last)) continue;if(dfn[v]>backtot) low[u] = min(low[u],dfn[v]);else {bool isb = Tarjan(v,i);all |= isb;low[u] = min(low[u],low[v]);if(low[v] > dfn[u] && isb) {if(ans > eg[res].w + eg[i].w) {ans = eg[res].w + eg[i].w;inf.first = eg[res].id;inf.second = eg[i].id;} }}}return ((u == t) | all);
}inline void out() {if(ans == 2e9+10) {cout << -1;return;}cout << ans << endl;cout << 1 + (inf.second!=-1) << endl;cout << inf.first;if(~inf.second) cout << " " << inf.second;
}int main() {IOS;ms(head,-1);cin >> n >> m;cin >> s >> t;for(int i = 1; i <= m; ++ i) {int u, v, w;cin >> u >> v >> w;if(u == v) continue;if(u > v)swap(u,v);add(u,v,w,i);add(v,u,w,i);} //............find_path(s);if(!e.size()) {cout << "0\n0\n";return 0;}//...........for(int i = 0; i < e.size() ; ++ i) {res = e[i];backtot = tot;Tarjan(s,-1);if(dfn[t]<=backtot) {if(ans > eg[res].w) {ans = eg[res].w;inf.first = eg[res].id;inf.second = -1;}}}out();return 0;
}
图论 ---- CF700 C. Break Up(Tarjan找桥+枚举+思维)相关推荐
- 无向图求割(找桥)tarjan
本博客参考了李煜东的<算法竞赛进阶指南>,大家要是觉得这篇文章写的不错请大家支持正版.豆瓣图书 我在之前的博客中讲解了搜索序时间戳,这次我们讲讲追溯值的概念. 追溯值: 设subtree( ...
- 【Gym - 101986F】Pizza Delivery(Dijkstra最短路,建图方式,反向建图,Tarjan求桥,图论模板)
题干: 题目大意: 一个有向图,编号1~n的n个点,m条边,规定1为起点,2为终点,问对于每一条边,反转它的方向,最短路会不会发生改变,如果变短了,输出HAPPY,变长了或者到达不了了输出SAD,不变 ...
- 无向图求割点(找桥)tarjan
本博客参考了李煜东的<算法竞赛进阶指南>,大家要是觉得这篇文章写的不错请大家支持正版.豆瓣图书 我在之前的博客中讲解了搜索序时间戳,这次我们讲讲追溯值的概念. 追溯值: 设subtree( ...
- 【牛客 - 272D】Where are you(Tarjan求桥)
题干: 小p和他的朋友约定好去游乐场游玩,但是他们到了游乐场后却互相找不到对方了. 游乐场可以看做是一张n个点,m条道路的图,每条道路有边权wi,表示第一次经过该道路时的花费(第二次及以后经过时花费为 ...
- tarjan求桥、割顶
若low[v]>dfn[u],则(u,v)为割边.但是实际处理时我们并不这样判断,因为有的图上可能有重边,这样不好处理.我们记录每条边的标号(一条无向边拆成的两条有向边标号相同),记录每个点的父 ...
- 数据结构与算法实验6——图论 7-9 哥尼斯堡的“七桥问题”
哥尼斯堡是位于普累格河上的一座城市,它包含两个岛屿及连接它们的七座桥,如下图所示. 可否走过这样的七座桥,而且每桥只走过一次?瑞士数学家欧拉(Leonhard Euler,1707-1783)最终解决 ...
- 图论--SCC强连通缩点--Tarjan
强连通缩点与双连通缩点大同小异,也就是说将强连通分支缩成一个点之后,没有强连通,成为有向无环图,在对图进行题目的操作. // Tarjan算法求有向图强连通分量并缩点 #include<iost ...
- 【洛谷T580】【模板】template 鸡腿 tarjan找割点
模板题. 代码: #include<cstdio> #include<iostream> #include<cstring> #include<algorit ...
- Last Theorem CodeForces - 1325F(dfs树找最大环+思维)
It's the year 5555. You have a graph, and you want to find a long cycle and a huge independent set, ...
最新文章
- SpringDataRedis对Redis的数据类型的常用操作API的使用代码举例
- flex vue 垂直居中居上_移动开发-flex 布局
- centos安装ES(elasticsearch)
- 人工智障学习笔记——机器学习(11)PCA降维
- python备份虚拟环境
- leetcode 200 python
- 关闭IE窗口时执行事件
- 状态压缩DP-棋盘模型总结
- 百度AI C#客户端车辆检测找不到VehicleDetect解决
- 惩罚函数法例题matlab,外点惩罚函数法例题
- 蓝桥ROS机器人之现代C++学习笔记7.4 条件变量
- 重装系统后需要做什么?
- 2017ccps网络赛 1003 Friend-Graph(暴力)HDU 6152
- [OpenGL] 非真实感渲染(NPR)的几种效果demo(水墨画/漫画/铅笔画)
- 数据挖掘之时间序列模型(最全流程分析)
- Word奇偶页的页眉页脚设置
- 微信小程序文件直接上传阿里云OSS
- 素描初习(一)---三棱锥
- mysql报错 Your password does not satisfy the current policy requirements
- 如何学习一门编程语言,从入门到不放弃!