2018-ACetic_ACid/AugTrain-06/G
从 Trac 迁移的文章
这是从旧校内 Wiki 迁移的文章,可能存在一些样式问题,您可以向 memset0 反馈。
原文章内容如下:
{{{
#include <bits/stdc++.h>
#ifdef LOCAL
#define debug 1
#else
#define debug 0
#endif
typedef long long ll;
using namespace std;
#define N 220000
int T,n,m;
int fir[N],nes[N<<1],v[N<<1],tot=1;
int jsq,sta[N],top=0,st,ed,pos[N],ring[N<<1],tmp1,tmp2;
bool Judge,mark[N],fz[N<<1];
int b[N];
vector<int> V[N];
void edge(int x,int y)
{
v[++tot]=y;
nes[tot]=fir[x];
fir[x]=tot;
}
void Edge(int x,int y)
{
edge(x,y);
edge(y,x);
}
void init()
{
for(int i=0;i<=tot;i++) fz[i]=false,ring[i]=false;
for(int i=1;i<=n;i++) fir[i]=0,mark[i]=false,b[i]=0;
tot=1;
top=0;
jsq=0;
Judge=false;
}
void dfs(int c)
{
mark[c]=true;
for(int t=fir[c];t;t=nes[t])
{
if(fz[t]) continue;
fz[t]=fz[t^1]=true;
if(mark[v[t]])
{
sta[++top]=t; fz[t]=fz[t^1]=true;
jsq++; V[jsq].clear();
for(int i=pos[v[t]]+1;i<=top;i++)
{
if(ring[sta[i]] && !Judge)
{
st=v[sta[i]^1]; Judge=true;
tmp1=ring[sta[i]];
tmp2=jsq;
}
ring[sta[i]]=jsq;
V[jsq].push_back(v[sta[i]]);
}
top--;
if(Judge) return;
continue;
}
sta[++top]=t;
pos[v[t]]=top;
dfs(v[t]);
if(Judge) return;
top--;
}
}
int main()
{
freopen("grand.in","r",stdin);
freopen("grand.out","w",stdout);
scanf("%d",&T);
while(T--)
{
init();
scanf("%d%d",&n,&m);
for(int i=1,x,y;i<=m;i++)
{
scanf("%d%d",&x,&y);
Edge(x,y);
}
for(int i=1;i<=n;i++)
{
if(!mark[i])
{
pos[i]=0;//<-就只改了这行
dfs(i);
}
if(Judge) break;
}
if(!Judge) { printf("-1\n"); continue; }
int i=0,j=0;
int st1,st2,ed1,ed2;
while(V[tmp1][i]!=st && i<V[tmp1].size()) i++;
if(i==V[tmp1].size())
{
printf("-1\n");
continue;
}
st1=i;
while(V[tmp2][j]!=st && j<V[tmp2].size()) j++;
if(j==V[tmp2].size())
{
printf("-1\n");
continue;
}
st2=j;
int cnt1=0;
while(V[tmp1][i]==V[tmp2][j])
{
i++;
if(i==V[tmp1].size()) i=0;
j++;
if(j==V[tmp2].size()) j=0;
cnt1++;
}
ed=V[tmp1][(i==0?(V[tmp1].size()-1):(i-1))];
printf("%d %d\n",st,ed);
printf("%d",cnt1);
for(i=st1;V[tmp1][i]!=ed;i=((i+1)==V[tmp1].size()?0:(i+1)))
{
printf(" %d",V[tmp1][i]);
}
printf(" %d\n",ed);
printf("%d",V[tmp1].size()-cnt1+2);
for(i=st1;V[tmp1][i]!=ed;i=((i==0)?(V[tmp1].size()-1):(i-1)))
{
printf(" %d",V[tmp1][i]);
}
printf(" %d\n",ed);
printf("%d",V[tmp2].size()-cnt1+2);
for(i=st2;V[tmp2][i]!=ed;i=((i==0)?(V[tmp2].size()-1):(i-1)))
{
printf(" %d",V[tmp2][i]);
}
printf(" %d\n",ed);
}
return 0;
}
}}}
#include <bits/stdc++.h>
#ifdef LOCAL
#define debug 1
#else
#define debug 0
#endif
typedef long long ll;
using namespace std;
#define N 220000
int T,n,m;
int fir[N],nes[N<<1],v[N<<1],tot=1;
int jsq,sta[N],top=0,st,ed,pos[N],ring[N<<1],tmp1,tmp2;
bool Judge,mark[N],fz[N<<1];
int b[N];
vector<int> V[N];
void edge(int x,int y)
{
v[++tot]=y;
nes[tot]=fir[x];
fir[x]=tot;
}
void Edge(int x,int y)
{
edge(x,y);
edge(y,x);
}
void init()
{
for(int i=0;i<=tot;i++) fz[i]=false,ring[i]=false;
for(int i=1;i<=n;i++) fir[i]=0,mark[i]=false,b[i]=0;
tot=1;
top=0;
jsq=0;
Judge=false;
}
void dfs(int c)
{
mark[c]=true;
for(int t=fir[c];t;t=nes[t])
{
if(fz[t]) continue;
fz[t]=fz[t^1]=true;
if(mark[v[t]])
{
sta[++top]=t; fz[t]=fz[t^1]=true;
jsq++; V[jsq].clear();
for(int i=pos[v[t]]+1;i<=top;i++)
{
if(ring[sta[i]] && !Judge)
{
st=v[sta[i]^1]; Judge=true;
tmp1=ring[sta[i]];
tmp2=jsq;
}
ring[sta[i]]=jsq;
V[jsq].push_back(v[sta[i]]);
}
top--;
if(Judge) return;
continue;
}
sta[++top]=t;
pos[v[t]]=top;
dfs(v[t]);
if(Judge) return;
top--;
}
}
int main()
{
freopen("grand.in","r",stdin);
freopen("grand.out","w",stdout);
scanf("%d",&T);
while(T--)
{
init();
scanf("%d%d",&n,&m);
for(int i=1,x,y;i<=m;i++)
{
scanf("%d%d",&x,&y);
Edge(x,y);
}
for(int i=1;i<=n;i++)
{
if(!mark[i])
{
pos[i]=0;//<-就只改了这行
dfs(i);
}
if(Judge) break;
}
if(!Judge) { printf("-1\n"); continue; }
int i=0,j=0;
int st1,st2,ed1,ed2;
while(V[tmp1][i]!=st && i<V[tmp1].size()) i++;
if(i==V[tmp1].size())
{
printf("-1\n");
continue;
}
st1=i;
while(V[tmp2][j]!=st && j<V[tmp2].size()) j++;
if(j==V[tmp2].size())
{
printf("-1\n");
continue;
}
st2=j;
int cnt1=0;
while(V[tmp1][i]==V[tmp2][j])
{
i++;
if(i==V[tmp1].size()) i=0;
j++;
if(j==V[tmp2].size()) j=0;
cnt1++;
}
ed=V[tmp1][(i==0?(V[tmp1].size()-1):(i-1))];
printf("%d %d\n",st,ed);
printf("%d",cnt1);
for(i=st1;V[tmp1][i]!=ed;i=((i+1)==V[tmp1].size()?0:(i+1)))
{
printf(" %d",V[tmp1][i]);
}
printf(" %d\n",ed);
printf("%d",V[tmp1].size()-cnt1+2);
for(i=st1;V[tmp1][i]!=ed;i=((i==0)?(V[tmp1].size()-1):(i-1)))
{
printf(" %d",V[tmp1][i]);
}
printf(" %d\n",ed);
printf("%d",V[tmp2].size()-cnt1+2);
for(i=st2;V[tmp2][i]!=ed;i=((i==0)?(V[tmp2].size()-1):(i-1)))
{
printf(" %d",V[tmp2][i]);
}
printf(" %d\n",ed);
}
return 0;
}