Almost Acyclic Graph Codeforces - 915D

以前做过的题都不会了。。。。

此题做法:优化的暴力

有一个显然的暴力:枚举每一条边试着删掉

注意到题目要求使得图无环,那么找出图上任意一个环,都应当要在其某一处断开(当然没有环是YES)

因此找出图中任意一个简单环(点不重复),枚举断开其上每一条边即可(共最多n条边)

复杂度O(n*(n+m))

注意:不能用拓扑排序找出在任意环上的点再找任意环,因为拓扑排序后入度不为0的不一定是环上的点(比如可能是某个点,没有出边,仅有一条入边,是某个环上的点引出的)(曾经错了)

  1 #include<cstdio>
  2 #include<algorithm>
  3 #include<vector>
  4 #include<queue>
  5 #define pb push_back
  6 using namespace std;
  7 int n,m,aa,bb;
  8 vector<int> e[510],ann;
  9 queue<int> q;
 10 int ma[510],in[510],st;
 11 bool fl,ok[510];
 12 namespace Tarjan
 13 {
 14 int s[510],dfn[510],low[510],dfc,top,sccnum[510],sccc,sz[510];
 15 void dfs(int u)
 16 {
 17     dfn[u]=low[u]=++dfc;
 18     s[++top]=u;
 19     for(auto v:e[u])
 20     {
 21         if(!dfn[v])
 22         {
 23             dfs(v);
 24             low[u]=min(low[u],low[v]);
 25         }
 26         else if(!sccnum[v])
 27             low[u]=min(low[u],dfn[v]);
 28     }
 29     if(low[u]==dfn[u])
 30     {
 31         sccc++;
 32         while(top&&s[top]!=u)    sccnum[s[top--]]=sccc;
 33         sccnum[s[top--]]=sccc;
 34     }
 35 }
 36 void work()
 37 {
 38     int i;
 39     for(i=1;i<=n;i++)
 40         if(!dfn[i])
 41             dfs(i);
 42     for(i=1;i<=n;i++)
 43         sz[sccnum[i]]++;
 44     for(i=1;i<=sccc;i++)
 45         if(sz[i]>1)
 46         {
 47             fl=1;
 48             st=i;
 49             break;
 50         }
 51     for(i=1;i<=n;i++)
 52         if(sccnum[i]==st)
 53             ok[i]=1;
 54     for(i=1;i<=n;i++)
 55         if(sccnum[i]==st)
 56         {
 57             st=i;
 58             break;
 59         }
 60 }
 61 }
 62 int main()
 63 {
 64     int i,j,a,b,u;
 65     scanf("%d%d",&n,&m);
 66     for(i=1;i<=m;i++)
 67     {
 68         scanf("%d%d",&a,&b);
 69         e[a].pb(b);
 70     }
 71     Tarjan::work();
 72     if(!fl)    {puts("YES");return 0;}
 73     for(u=st;;)
 74     {
 75         ann.pb(u);
 76         if(ma[u])    break;
 77         ma[u]=ann.size();
 78         for(auto v:e[u])
 79             if(ok[v])
 80             {
 81                 u=v;
 82                 break;
 83             }
 84     }
 85     for(j=ma[ann[ann.size()-1]]-1;j<ann.size()-1;j++)
 86     {
 87         aa=ann[j];bb=ann[j+1];
 88         for(i=1;i<=n;i++)    in[i]=0;
 89         for(i=1;i<=n;i++)
 90             for(auto v:e[i])
 91             {
 92                 if(i==aa&&v==bb)    continue;
 93                 in[v]++;
 94             }
 95         for(i=1;i<=n;i++)
 96             if(!in[i])
 97                 q.push(i);
 98         while(!q.empty())
 99         {
100             u=q.front();q.pop();
101             for(auto v:e[u])
102             {
103                 if(u==aa&&v==bb)    continue;
104                 in[v]--;
105                 if(!in[v])    q.push(v);
106             }
107         }
108         fl=1;
109         for(i=1;i<=n;i++)
110             if(in[i])
111                 fl=0;
112         if(fl)
113         {
114             puts("YES");
115             return 0;
116         }
117     }
118     puts("NO");
119     return 0;
120 }

原文地址:https://www.cnblogs.com/hehe54321/p/9026346.html

时间: 2024-07-31 07:33:33

Almost Acyclic Graph Codeforces - 915D的相关文章

Almost Acyclic Graph CodeForces - 915D (思维+拓扑排序判环)

Almost Acyclic Graph CodeForces - 915D time limit per test 1 second memory limit per test 256 megabytes input standard input output standard output You are given a directed graph consisting of n vertices and m edges (each edge is directed, so it can

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

[题目]D. Almost Acyclic Graph [题意]给定n个点的有向图(无重边),问能否删除一条边使得全图无环.n<=500,m<=10^5. [算法]拓扑排序 [题解]找到一个简单环,则欲删除的边一定经过该环.尝试环上的每一条边(至多n条边)后再次拓扑排序判断全图是否有环. 拓扑排序后定位到简单环:剩余图是环+环内DAG,DFS过程中将走入死路的点标-1,访问过标1,找到访问过的点就是简单环.换起始点直到找到环为止. 复杂度O(nm). #include<cstdio>

Codeforces 915D Almost Acyclic Graph

题意翻译 给定一个n个顶点,m条边的有向图.你允许从其中去掉最多一条边. 你能够去掉最多一条边就让这个图无环吗?我们称一个有向图无环,当且仅当它不包含一个环(起点和终点相同的路径). 输入格式: 第一行两个正整数n,mn,m 2\le n\le 500,1\le m\le min(n(n-1),100000)2≤n≤500,1≤m≤min(n(n?1),100000) ,代表图的顶点数和边数. 接下来mm 行,每行两个数u,vu,v ,表示有一条从uu 到vv 的有向边(1\le u,v\le

CodeForces 840B - Leha and another game about graph | Codeforces Round #429(Div 1)

思路来自这里,重点大概是想到建树和无解情况,然后就变成树形DP了- - /* CodeForces 840B - Leha and another game about graph [ 增量构造,树上差分 ] | Codeforces Round #429(Div 1) 题意: 选择一个边集合,满足某些点度数的奇偶性 分析: 将d = 1的点连成一颗树,不在树上的点都不连边. 可以发现,当某个节点u的所有子节点si均可操控 (u, si) 来满足自身要求 即整棵树上至多只有1个点不满足自身要求,

Edge coloring of bipartite graph CodeForces - 600F (二分图染色)

大意:给定二分图, 求将边染色, 使得任意邻接边不同色且使用颜色种类数最少 最少颜色数即为最大度数, 要输出方案的话, 对于每一条边(u,v), 求出u,v能使用的最小的颜色$t0$,$t1$ 若t0=t1, 直接染就行不会有冲突, 否则就染为t0, 这样的话可能产生冲突, 就将冲突的边换成t1, 依次递归下去 由于二分图的性质, 最终一定可以找到一条边不冲突 #include <iostream> #include <algorithm> #include <cstdio&

【题解】Red-Blue Graph Codeforces 1288F 上下界费用流

特别有趣的一个题. 很容易想到可能是网络流问题,关键在于如何刻画诸如"Red边比Blue边多"这样的限制. 最后我还是看了题解...很有趣的思路. 对于每条边,假设她连接了左边点u和右边点v,那么: 从u到v连一条容量是1,费用是r的边,如果走了这条边,意味着这条边染Red. 从v到u连一条容量是1,费用是b的边,如果走了这条边,意味着这条边染Blue. 对于左边的有Red限制的点,显然要求这个点"出去的流量"大于"进来的流量",因此从这个点连向

CF915D Almost Acyclic Graph (思维+拓扑)

如果想要判定是否是DAG,用拓扑排序是一个好选择,但是本题可以删一条边 如果真的傻傻的去枚举删边就难顶了 我们要想到,对于删边,其实就是入度-1,而我们知道,删完能拓扑,说明成功了,因此只要枚举点,对入度操作再跑拓扑,就能AC 这个转化还是很有意思的,我们来思考正确性,首先对于一个环,肯定因为到了某个情况所有的入度都不为0,所以加不进队列.而对于环上一点,本来跑完拓扑之后就剩下环上的边,这次入度-1,相当于 忽略了环上的边,就成功了破解了,如果这个点上存在两个环,那还是没用,因为减完入度还有 #

Codeforces 825E Minimal Labels - 拓扑排序 - 贪心

You are given a directed acyclic graph with n vertices and m edges. There are no self-loops or multiple edges between any pair of vertices. Graph can be disconnected. You should assign labels to all vertices in such a way that: Labels form a valid pe

Educational Codeforces Round 36

Educational Codeforces Round 36 A. Garden 题目描述:给定\(n\)个数,找出能整除\(m\)的最大的数(假设是\(num\)),输出\(\frac{m}{num}\). solution 枚举. 时间复杂度:\(O(n)\) B. Browser 题目描述:有\(n\)个标签页,当前在第\(i\)页,有下面六个操作: 向左移动一个页面,即\(i-1\) 向右移动一个页面, 即\(i+1\) 关闭左边一个页面,即第\(i-1\)个页面 关闭右边一个页面,即