Submission #115896

#TimeUsernameProblemLanguageResultExecution timeMemory
115896rajarshi_basuPotemkin cycle (CEOI15_indcyc)C++14
100 / 100
698 ms6400 KiB
#include <iostream> #include <vector> #include <set> #include <iomanip> #include <algorithm> #include <functional> #include <stdio.h> #include <cmath> #include <queue> #include <string> #include <map> #include <fstream> #include <complex> #include <stack> #include <set> #define FOR(i,n) for(int i=0;i<n;i++) #define FORE(i,a,b) for(int i=a;i<=b;i++) #define ll long long int #define vi vector<int> #define ii pair<int,int> #define pb push_back #define mp make_pair #define ff first #define ss second #define pll pair<ll,ll> #define cd complex<double> #define ld long double #define pld pair<ld,ld> #define iii pair<ii,int> using namespace std; const int INF = 1e9+10; const int MAXN = 1000+10; int n,m; bool mat[MAXN][MAXN]; int vis[MAXN][MAXN]; bool dvis[MAXN][MAXN]; bool validEdge[MAXN][MAXN]; stack<ii> cyc; set<int> allnode; bool done = 0; inline bool isok(int a,int b,int c){ return (!(mat[a][b] and mat[b][c] and mat[a][c])); } void dfs1(ii node){ if(done)return; cyc.push(node); //cout << node.ff << " " << node.ss << endl; if(vis[node.ff][node.ss]){ // we got our cycle if(cyc.size() < 3){ cyc.pop(); return; } allnode.insert(node.ff); allnode.insert(node.ss); cyc.pop(); while(cyc.size() > 0){ ii x = cyc.top();cyc.pop(); //if(x.ff == x.ss)break; // cout <<x.ff << ' ' << x.ss << endl; validEdge[x.ff][x.ss] = validEdge[x.ss][x.ff] = 1; allnode.insert(x.ff); allnode.insert(x.ss); if(x.ff == node.ff and x.ss == node.ss)break; } done = 1; return; } vis[node.ff][node.ss] = 1; //vis[node.ss][node.ff] = 1; FOR(nxt,n){ if(nxt == node.ff or node.ss == nxt)continue; if(!mat[nxt][node.ss])continue; if(isok(node.ff,node.ss,nxt)){ // this is a valid edge; if(vis[node.ss][nxt] == 2)continue; dfs1({node.ss,nxt}); //vis[node.ff][node.ss] = 0; if(done)return; } } vis[node.ff][node.ss] = 2; if(cyc.size()>0)cyc.pop(); } bool impNode[MAXN]; bool vis2[MAXN]; stack<int> st; vector<int> cc; void dfs2(int node,int p = -1){ if(done)return; st.push(node); //cout << node << endl; vis2[node] = 1; FOR(i,n){ if(node == i)continue; if(p == i)continue; if(done)return; if(mat[node][i] and vis2[i] and impNode[i] and !validEdge[node][i]){ //st.pop(); while(!st.empty()){ int x = st.top();st.pop(); cc.pb(x); if(x == i)break; } done = 1; return; } if(validEdge[node][i]){ if(vis2[i]){ //st.pop(); while(!st.empty()){ int x = st.top();st.pop(); cc.pb(x); if(x == i)break; } done = 1; }else{ dfs2(i,node); } } if(done)return; } if(st.size()>0)st.pop(); } int main(){ cin >> n >> m; FOR(i,n)FOR(j,n)mat[i][j] = validEdge[i][j] = vis[i][j] = 0; FOR(i,m){ int a,b; cin >> a >> b; a--;b--; mat[a][b] = mat[b][a] = 1; } // input done FOR(i,n){ FOR(j,n) if(!vis[i][j] and i != j and mat[i][j]) dfs1({i,j}); while(!cyc.empty())cyc.pop(); } if(!done){ cout << "no" << endl; return 0; } int x; for(auto e:allnode){ impNode[e] = 1; x = e; } /* cout << endl; for(auto e:allnode){ cout << e << endl; } cout << endl; */ FOR(i,n){ FOR(j,n){ if(validEdge[i][j] and !mat[i][j])return -1; } } done = 0; dfs2(x); if(cc.empty()){ cout << "no" << endl; }else{ FOR(i,cc.size()){ //if(!mat[cc[(i+cc.size()-1)%cc.size()]][cc[i]])return -1; } for(auto e:cc){ cout << e+1 << " "; } cout << endl; } return 0; }

Compilation message (stderr)

indcyc.cpp: In function 'int main()':
indcyc.cpp:145:58: warning: suggest parentheses around assignment used as truth value [-Wparentheses]
  FOR(i,n)FOR(j,n)mat[i][j] = validEdge[i][j] = vis[i][j] = 0;
                                                ~~~~~~~~~~^~~
indcyc.cpp:17:31: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
 #define FOR(i,n) for(int i=0;i<n;i++)
indcyc.cpp:191:7:
   FOR(i,cc.size()){
       ~~~~~~~~~~~              
indcyc.cpp:191:3: note: in expansion of macro 'FOR'
   FOR(i,cc.size()){
   ^~~
indcyc.cpp:186:6: warning: 'x' may be used uninitialized in this function [-Wmaybe-uninitialized]
  dfs2(x);
  ~~~~^~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...