SGU 219 Synchrograph tarjian找环,理解题意,图论 难度:3
http://acm.sgu.ru/problem.php?contest=0&problem=219
题目大意:
如果指向某个点的边权全都为正数,那么这个点就是可点燃的,点燃操作把入弧权值-1,出弧权值都+1,
如果在某种点燃序列之后还可以再点燃一些点使得这个点还可以点燃,那么这个点在这种点燃序列之后存活
如果在任何点燃序列之后都还可以再点燃一些点使得这个点还可以点燃,那么这个点可存活
现在求所有点是否可存活
思路:
考虑不可存活的点:对于某个状态,对于不可存活的点,要想使得没有序列可以使它被点燃,那么有边指向它的点里一定有不可存活的点,且这条边权值为0,
如果有一个边权值都为0的环,那么在这条环上,由于权值都为0,所以这个环上的都是不可存活的点.
所以:先通过求边权值都为0的环确定一些初始点,由这些不可存活点出发到达的点,都在某个序列下因为这些不可存活点不能提供权值而不能存活
注意:
1. 有自环
2. tarjian找环需要注意更新dfn值的点在stack内,否则对于我写的形式
会有
这种情况不正确
#include <cstdio>
#include <stack>
#include <cstring>
using namespace std;
const int maxn=1e3+3;
const int maxm=5e4+4;
int n,m; int first[maxn],head[maxn];
struct edge{
int t,nxt;
}e[maxm],g[maxm]; int low[maxn],dp[maxn],depth;
int alive[maxn];
bool in[maxn]; void addedge(int f,int t,int c,int ind){
if(c==0){
g[ind].nxt=head[f];
g[ind].t=t;
head[f]=ind;
}
e[ind].nxt=first[f];
e[ind].t=t;
first[f]=ind;
} stack<int> st;
void tarjian(int s){
low[s]=dp[s]=++depth;
in[s]=true;st.push(s);
for(int p=head[s];p!=-1;p=g[p].nxt){
int t=g[p].t;
if(t==s){
alive[s]=0;
}
if(dp[t]==0){
tarjian(t);
low[s]=min(low[s],low[t]);
}
else if(in[t]){//ATTHENTION:
low[s]=min(low[s],dp[t]);
}
} bool single=true;
if(low[s]==dp[s]){
while(st.top()!=s){
single=false;
alive[st.top()]=0; in[st.top()]=false;st.pop();
}
if(!single){
alive[st.top()]=0;
}
in[st.top()]=false;st.pop();
}
} void dfs(int s){
for(int p=first[s];p!=-1;p=e[p].nxt){
int t=e[p].t;
if(alive[t]==1){
alive[t]=0;
dfs(t);
}
} } int main(){
scanf("%d%d",&n,&m);
memset(first,-1,sizeof(first));
memset(head,-1,sizeof(head));
fill(alive,alive+n+1,1);
for(int i=0;i<m;i++){
int f,t,c;
scanf("%d%d%d",&f,&t,&c);
addedge(f,t,c,i);
} for(int i=1;i<=n;i++){
if(dp[i]==0){
tarjian(i);
}
} for(int i=1;i<=n;i++){
if(alive[i]==0){
dfs(i);
}
} for(int i=1;i<=n;i++){
printf("%d\n",alive[i]);
} return 0;
}
SGU 219 Synchrograph tarjian找环,理解题意,图论 难度:3的更多相关文章
- 【CodeForces】915 D. Almost Acyclic Graph 拓扑排序找环
[题目]D. Almost Acyclic Graph [题意]给定n个点的有向图(无重边),问能否删除一条边使得全图无环.n<=500,m<=10^5. [算法]拓扑排序 [题解]找到一 ...
- Codeforces Round #369 (Div. 2) D. Directed Roads —— DFS找环 + 快速幂
题目链接:http://codeforces.com/problemset/problem/711/D D. Directed Roads time limit per test 2 seconds ...
- # 「银联初赛第一场」自学图论的码队弟弟(dfs找环+巧解n个二元一次方程)
「银联初赛第一场」自学图论的码队弟弟(dfs找环+巧解n个二元一次方程) 题链 题意:n条边n个节点的连通图,边权为两个节点的权值之和,没有「自环」或「重边」,给出的图中有且只有一个包括奇数个结点的环 ...
- [图中找环] Codeforces 659E New Reform
New Reform time limit per test 1 second memory limit per test 256 megabytes input standard input out ...
- [hdu5348]图上找环,删环
http://acm.hdu.edu.cn/showproblem.php?pid=5348 题意:给一个无向图,现在要将其变成有向图,使得每一个顶点的|出度-入度|<=1 思路:分为两步,(1 ...
- zstu.4191: 无向图找环(dfs树 + 邻接表)
4191: 无向图找环 Time Limit: 5 Sec Memory Limit: 128 MB Submit: 117 Solved: 34 Description 给你一副无向图,每条边有 ...
- Mouse Hunt CodeForces - 1027D(思维 找环)
Medicine faculty of Berland State University has just finished their admission campaign. As usual, a ...
- HDU - 6370 Werewolf 2018 Multi-University Training Contest 6 (DFS找环)
求确定身份的人的个数. 只能确定狼的身份,因为只能找到谁说了谎.但一个人是否是民,无法确定. 将人视作点,指认关系视作边,有狼边和民边两种边. 确定狼的方法只有两种: 1. 在一个仅由一条狼边组成的环 ...
- Codeforces Beta Round #88 C. Cycle —— DFS(找环)
题目链接:http://codeforces.com/problemset/problem/117/C C. Cycle time limit per test 2.5 seconds memory ...
随机推荐
- CSRF攻击详解(转)
原文:http://www.django-china.cn/topic/580/ 一.CSRF是什么? CSRF(Cross-site request forgery),中文名称:跨站请求伪造,也被称 ...
- js-template-art【一】简述
一.官方地址 地址:https://github.com/aui/art-template 二.概述 官方对比 三.特性 拥有接近 JavaScript 渲染极限的的性能 调试友好:语法.运行时错误日 ...
- Java基础方法
1:读取resource下面的文件 ClassPathResource cpr = new ClassPathResource("./MyBatisXmlFile"); File ...
- Android初体验之Monkey和MonkeyRunner
原文地址https://blog.csdn.net/mad1989/article/details/38087737 Monkey 什么是Monkey Monkey是Android中的一个命令行工具, ...
- java打印随机函数
一 ,打印1-10的随机函数 public static void randomprint(){ for (int i=0;i<100;i++){ //打印一百次 ...
- hdu 5185 动态规划 分析降低复杂度
这题说的是 x[1]+x[2]+x[3]+…+x[n]=n, 这里 0 <= x[i] <= n && 1 <= i <= n x[i] <= x[i+1 ...
- linux_一些shell命令分析记录
一.用于shell脚本的界面命令交互 echo "请输入css-dist下载地址:" read addcss echo "开始下载css的zip包"( wget ...
- 嵌入式 Linux 如何操作 GPIO ?
作者:刘凯链接:https://www.zhihu.com/question/19704852/answer/19760467来源:知乎著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注明出 ...
- fiddler几种功能强大的用法(一)
参考网址: http://caibaojian.com/fiddler.html http://www.cnblogs.com/tangdongchu/p/4178552.html 1.fiddler ...
- Ubuntu 安装 Telnet
参考:在 ubuntu 上安裝 telnet service 1.安装: sudo apt-get install xinetd telnetd 2.修改inetd.conf: vim /etc/in ...