Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- //==================================================================//
- // Name : flash7even //
- // Author : Tarango Khan //
- // Codeforces : flash_7 //
- // Topcoder : flash_7 //
- // Hackerrank : flash_7 //
- // Email : tarangokhan77@gmail.com //
- // Facebook : tarango.khan //
- //==================================================================//
- //==================================================================//
- #include <bits/stdc++.h> //
- using namespace std; //
- #define read(nm) freopen(nm, "r", stdin) //
- #define write(nm) freopen(nm, "w", stdout) //
- #define pb push_back //
- #define mp make_pair //
- #define F first //
- #define S second //
- #define eps 1e-9 //
- #define FABS(x) ((x)+eps<0?-(x):(x)) //
- #define pf printf //
- #define sf scanf //
- #define pi acos(-1.0) //
- #define SZ(x) ((int)(x).size()) //
- #define mems(x,v) memset(x,v,sizeof(x)) //
- #define fills(v,n) fill(v.begin(), v.end(), n) //
- #define vsort(v) sort(v.begin(),v.end()) //
- #define asort(v,n) sort(a,a+n) //
- #define LL long long //
- #define LLU long long unsigned int //
- #define vu_bound(v,a) upper_bound(v.begin(),v.end(),a)-v.begin() //
- #define vl_bound(v,a) lower_bound(v.begin(),v.end(),a)-v.begin() //
- #define fast_cin ios_base::sync_with_stdio(false);cin.tie(NULL) //
- //==================================================================//
- //==================================================================//
- void make_unique(vector<int> &a){ sort(a.begin(), a.end()); //
- a.erase(unique(a.begin(), a.end()), a.end()); } //
- int Set(int N,int cur){ return N = N | (1<<cur); } //
- int Reset(int N,int cur){ return N = N & ~(1<<cur); } //
- bool Check(int N,int cur){ return (bool)(N & (1<<cur)); } //
- LL GCD(LL a,LL b){ if(b == 0) return a; return GCD(b,a%b);} //
- LL LCM(LL a,LL b){ return a*b/GCD(a,b);} //
- LL POW(LL a,LL p){ LL res = 1,x = a;while(p){if(p&1) //
- res = (res*x); x = (x*x);p >>= 1;} return res;} //
- //==================================================================//
- //==================================================================//
- //int knightDir[8][2] = {{-2,1},{-1,2},{1,2},{2,1}, //
- // {2,-1},{-1,-2},{1,-2},{-2,-1}}; //
- //int dir8[4][2] = {{-1,0},{0,1},{1,0},{0,-1}, //
- // {-1,-1},{1,1},{1,-1},{-1,1}}; //
- //int dir4[4][2] = {{-1,0},{0,1},{1,0},{0,-1}}; //
- //==================================================================//
- //=======// Done With The Shortcut Stuffs! Now Let's Code! //=======//
- #define Mod 1000000007
- struct edge{
- int v;
- int idx;
- edge(int a,int b){
- v = a;
- idx = b;
- }
- };
- int N,M,u,v;
- vector<edge> Graph[100005];
- int ind1[100005];
- int ind2[100005];
- pair<int,int> E[100005];
- bool isDist(){
- queue<int> Q;
- for(int i = 1;i<=N;i++){
- ind1[i] = ind2[i];
- if(ind1[i] == 0) Q.push(i);
- }
- while(Q.empty() == false){
- if(Q.size() > 1) return false;
- int u = Q.front();
- Q.pop();
- int Sz = Graph[u].size();
- for(int i = 0;i<Sz;i++){
- int v = Graph[u][i].v;
- ind1[v]--;
- if(ind1[v] == 0){
- Q.push(v);
- }
- }
- }
- return true;
- }
- bool isValid(int k){
- queue<int> Q;
- mems(ind1,0);
- for(int i = 1;i<=N;i++){
- Graph[i].clear();
- }
- for(int i = 1;i<=k;i++){
- int u = E[i].first;
- int v = E[i].second;
- Graph[u].pb(edge(v,i));
- ind1[v]++;
- }
- for(int i = 1;i<=N;i++){
- if(ind1[i] == 0) Q.push(i);
- }
- while(Q.empty() == false){
- if(Q.size() > 1) return false;
- int u = Q.front();
- Q.pop();
- int Sz = Graph[u].size();
- for(int i = 0;i<Sz;i++){
- int v = Graph[u][i].v;
- ind1[v]--;
- if(ind1[v] == 0){
- Q.push(v);
- }
- }
- }
- return true;
- }
- int solve(){
- int L = 1,R = M;
- while(L<R){
- int mid = (L+R)/2;
- bool rs = isValid(L);
- if(rs == true){
- R = mid-1;
- }else{
- L = mid+1;
- }
- }
- if(L>1) L--;if(L>1) L--;
- while(L<M){
- bool rs = isValid(L);
- if(rs == true) break;
- L++;
- }
- if(L>M) L = M;
- return L;
- }
- int main(){
- sf("%d %d",&N,&M);
- mems(ind1,0);
- for(int i = 1;i<=M;i++){
- sf("%d %d",&u,&v);
- E[i] = mp(u,v);
- Graph[u].pb(edge(v,i));
- ind1[v]++;
- ind2[v]++;
- }
- bool f = isDist();
- if(f == false){
- cout << "-1" << endl;
- return 0;
- }
- int res = solve();
- cout << res << endl;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement