This submission is migrated from previous version of oj.uz, which used different machine for grading. This submission may have different result if resubmitted.
#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 time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |