首页 > 代码库 > codeforces 645D Robot Rapping Results Report
codeforces 645D Robot Rapping Results Report
二分一下答案check即可。(拓扑排序)
#include<iostream>#include<cstdio>#include<cstring>#include<queue>#include<algorithm>#define maxv 100500#define maxe 200500using namespace std;int n,m,nume=0,g[maxv],x[maxv],y[maxv],d[maxv],rank[maxv];int cnt[maxv];queue <int> q;struct edge{ int v,nxt;}e[maxe];void addedge(int u,int v){ e[++nume].v=v; e[nume].nxt=g[u]; g[u]=nume;}bool check(int x){ int ret=0;while (!q.empty()) q.pop(); for (int i=1;i<=n;i++) {d[i]=0;rank[i]=-1;cnt[i]=0;} for (int i=1;i<=x;i++) d[y[i]]++; for (int i=1;i<=n;i++) { if (!d[i]) { if (ret) return false; q.push(i);ret++;rank[i]=1;cnt[1]++; } } while (!q.empty()) { int head=q.front();q.pop(); for (int i=g[head];i;i=e[i].nxt) { int v=e[i].v; if (i>x) continue; if (!--d[v]) { rank[v]=rank[head]+1;cnt[rank[v]]++; q.push(v); } } } for (int i=1;i<=n;i++) { if (cnt[i]!=1) return false; } return true;}int main(){ scanf("%d%d",&n,&m); for (int i=1;i<=m;i++) { scanf("%d%d",&x[i],&y[i]); addedge(x[i],y[i]); } int l=1,r=m,ans=-1; while (l<=r) { int mid=l+r>>1; if (check(mid)) {ans=mid;r=mid-1;} else l=mid+1; } printf("%d\n",ans); return 0;}
codeforces 645D Robot Rapping Results Report
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。