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的更多相关文章

  1. 【CodeForces】915 D. Almost Acyclic Graph 拓扑排序找环

    [题目]D. Almost Acyclic Graph [题意]给定n个点的有向图(无重边),问能否删除一条边使得全图无环.n<=500,m<=10^5. [算法]拓扑排序 [题解]找到一 ...

  2. 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 ...

  3. # 「银联初赛第一场」自学图论的码队弟弟(dfs找环+巧解n个二元一次方程)

    「银联初赛第一场」自学图论的码队弟弟(dfs找环+巧解n个二元一次方程) 题链 题意:n条边n个节点的连通图,边权为两个节点的权值之和,没有「自环」或「重边」,给出的图中有且只有一个包括奇数个结点的环 ...

  4. [图中找环] Codeforces 659E New Reform

    New Reform time limit per test 1 second memory limit per test 256 megabytes input standard input out ...

  5. [hdu5348]图上找环,删环

    http://acm.hdu.edu.cn/showproblem.php?pid=5348 题意:给一个无向图,现在要将其变成有向图,使得每一个顶点的|出度-入度|<=1 思路:分为两步,(1 ...

  6. zstu.4191: 无向图找环(dfs树 + 邻接表)

    4191: 无向图找环 Time Limit: 5 Sec  Memory Limit: 128 MB Submit: 117  Solved: 34 Description 给你一副无向图,每条边有 ...

  7. Mouse Hunt CodeForces - 1027D(思维 找环)

    Medicine faculty of Berland State University has just finished their admission campaign. As usual, a ...

  8. HDU - 6370 Werewolf 2018 Multi-University Training Contest 6 (DFS找环)

    求确定身份的人的个数. 只能确定狼的身份,因为只能找到谁说了谎.但一个人是否是民,无法确定. 将人视作点,指认关系视作边,有狼边和民边两种边. 确定狼的方法只有两种: 1. 在一个仅由一条狼边组成的环 ...

  9. Codeforces Beta Round #88 C. Cycle —— DFS(找环)

    题目链接:http://codeforces.com/problemset/problem/117/C C. Cycle time limit per test 2.5 seconds memory ...

随机推荐

  1. socket协议和http协议性能对比

    最近做了一次队列服务的性能测试,是通过两种协议windows socket和http分别往内存中写入url.对比哪种协议的效果更高,下图是测试结果.此次使用的工具是loadrunner.在压socke ...

  2. Redundant Paths---poj3177(双连通分量)

    题目链接:http://poj.org/problem?id=3177 题意:有n个牧场,Bessie 要从一个牧场到另一个牧场,要求至少要有2条独立的路可以走.现已有m条路,求至少要新建多少条路,使 ...

  3. flask实现api

    https://www.cnblogs.com/vovlie/p/4178077.html from flask import Flask, jsonify app = Flask(__name__) ...

  4. HTML---初识HTML

    版权声明:本文为博主原创文章.不经博主同意注明链接就可以转载. https://blog.csdn.net/Senior_lee/article/details/33723573          H ...

  5. MySQL的redo log结构和SQL Server的log结构对比

    MySQL的redo log结构和SQL Server的log结构对比 innodb 存储引擎 mysql技术内幕 log buffer根据一定规则将内存中的log block刷写到磁盘,这个规则是 ...

  6. Mybatis入门和简单Demo

    一.Mybatis的诞生 回顾下传统的数据库开发,JDBC和Hibernate是使用最普遍的技术,但这两种ORM框架都存在一定的局限性: JDBC:最原生的技术,简单易学,执行速度快,效率高,适合大数 ...

  7. [LeetCode] 83. Remove Duplicates from Sorted List_Easy tag: Linked List

    Given a sorted linked list, delete all duplicates such that each element appear only once. Example 1 ...

  8. 系统管理命令之whoami

    whoami命令用于打印当前有效的用户名称,相当于执行id  --un命令. 1.显示该命令帮助信息: # whoami --help 2.显示该命令的版本信息: # whoami --version ...

  9. try with resources简洁的异常捕获机制

    通过前篇的<Java文件IO流的操作总结>,我们知道了基本输入输出流的使用方式,但是每次都需要在finally处关闭流资源,这样操作起来既啰嗦又麻烦,有没有更简洁的方式呢?本篇就来讲解jd ...

  10. 2. Add Two Numbers(2个链表相加)

    You are given two non-empty linked lists representing two non-negative integers. The digits are stor ...