直接令2i-1和2i的位置不相同,相当于有2n条边,对其进行二分图染色即可(这张图一定不存在奇环)。
假设给出的n条关系是A类边,2i-1和2i的边是B类边,可以发现一条路径一定是AB交替(因为A/B的终点一定不可能是A/B的起点),那么环就一定是有等量的A边和B边,即偶环。
1 #include<bits/stdc++.h> 2 using namespace std; 3 #define N 200005 4 struct ji{ 5 int nex,to; 6 }edge[N<<1]; 7 int E,n,a[N],head[N],x[N],y[N]; 8 void add(int x,int y){ 9 edge[E].nex=head[x]; 10 edge[E].to=y; 11 head[x]=E++; 12 } 13 void dfs(int k,int sh){ 14 if (a[k]>=0)return; 15 a[k]=sh; 16 for(int i=head[k];i!=-1;i=edge[i].nex)dfs(edge[i].to,sh^1); 17 } 18 int main(){ 19 scanf("%d",&n); 20 memset(head,-1,sizeof(head)); 21 memset(a,-1,sizeof(a)); 22 for(int i=1;i<=n;i++){ 23 scanf("%d%d",&x[i],&y[i]); 24 add(x[i],y[i]); 25 add(y[i],x[i]); 26 add(2*i-1,2*i); 27 add(2*i,2*i-1); 28 } 29 for(int i=1;i<=2*n;i++) 30 if (a[i]==-1)dfs(i,0); 31 for(int i=1;i<=n;i++)printf("%d %d\n",a[x[i]]+1,a[y[i]]+1); 32 }