标签:环上 Almost Graph 拓扑 入度 long int CF915D include
如果想要判定是否是DAG,用拓扑排序是一个好选择,但是本题可以删一条边
如果真的傻傻的去枚举删边就难顶了
我们要想到,对于删边,其实就是入度-1,而我们知道,删完能拓扑,说明成功了,因此只要枚举点,对入度操作再跑拓扑,就能AC
这个转化还是很有意思的,我们来思考正确性,首先对于一个环,肯定因为到了某个情况所有的入度都不为0,所以加不进队列。而对于环上一点,本来跑完拓扑之后就剩下环上的边,这次入度-1,相当于
忽略了环上的边,就成功了破解了,如果这个点上存在两个环,那还是没用,因为减完入度还有
#include<iostream> #include<cstring> #include<cstdio> #include<map> #include<algorithm> #include<queue> #include<set> #define ull unsigned long long using namespace std; typedef long long ll; typedef pair<int,int> pll; const int N=1e5+10; int in[N],in1[N]; vector<int> g[N]; int n; bool topo(){ queue<int> q; int i; int sum=0; for(i=1;i<=n;i++){ if(!in[i]) q.push(i); } while(q.size()){ int t=q.front(); q.pop(); sum++; for(i=0;i<g[t].size();i++){ int j=g[t][i]; in[j]--; if(!in[j]) q.push(j); } } if(sum==n) return true; return false; } int main(){ int i; int m; cin>>n>>m; for(i=1;i<=m;i++){ int u,v; scanf("%d%d",&u,&v); g[u].push_back(v); in[v]++; in1[v]++; } if(topo()){ cout<<"YES"<<endl; return 0; } else{ for(i=1;i<=n;i++){ memcpy(in,in1,sizeof in); if(in[i]>=1){ in[i]--; if(topo()){ cout<<"YES"<<endl; return 0; } } } } cout<<"NO"<<endl; return 0; }View Code
标签:环上,Almost,Graph,拓扑,入度,long,int,CF915D,include 来源: https://www.cnblogs.com/ctyakwf/p/12633734.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。