Problem:
Problem F: 自転車

Problem Statement

菊地君は、大の自転車好きである。今日も彼は、お気に入りの自転車に乗ってサイクリングロードへと走り出そうとしている。

彼が住む地域には、N個の町が存在する。各町を町1、町2...、町Nと呼ぶこととする。彼が住む町は、町1である。この地域には、サイクリングを趣味としている人が多く、最近では頻繁に町と町を結ぶサイクリングロードが作られている。サイクリングロードを使うと、2つの町を双方向に移動できる。入力では、どの町とどの町が新しくサイクリングロードで繋がれたかが時系列順に入力される。

菊地君は、新しいサイクリングロードが1つ完成したときに、次に示す条件を満たすときだけサイクリングに出かける。まず、サイクリング中に同じ風景を何回も見るのはつまらないため、同じ町や同じサイクリングロードを2回以上通らないような道順である必要がある。サイクリングの終了時には家に帰るようにしたいため、スタート地点は町1で、ゴール地点は町1である必要がある。そして、完成した最新のサイクリングロード1つを必ず走らなければならない。また、全ての町やサイクリングロードを通る必要はない。

完成したサイクリングロードが時系列順に与えられるので、各サイクリングロードが完成した時点で、菊地君がサイクリングできるかどうかを答えよ。

Input

各データセットは、以下の形式で入力される。

N M
a1 b1
a2 b2
...
aM bM

入力値は、全て整数である。Nは町の数、Mは作られるサイクリングロードの数である。始め、どの町と町の間にもサイクリングロードは作られていない。aiとbiは、町aiと町biを繋ぐサイクリングロードが、i番目に完成することを表わしている。

Constraints

3 <= N <= 100

1 <= M <= N * (N - 1) / 2

1 <= ai, bi <= N

ai ≠ bi

同じ町間を繋ぐサイクリングロードは、2回以上現れない。

Output

M行にわたって、問題文に指定された条件で菊地君がサイクリングできるかどうかを答えよ。出力のi行目は、{(a1, b1), (a2, b2), ..., (ai, bi)}のサイクリングロードを使って、サイクリングできるかどうかを出力する。サイクリングできるならば"Yes"、できないならば"No"と出力せよ。

Sample Input 1

3 3
1 2
2 3
3 1

Output for the Sample Input 1

No
No
Yes

始めの2つのサイクリングロードだけでは、自分の町に戻ることができないためNoとなる。(3, 1)が追加されたときは、新しいサイクリングロード(3と1の道)を通りつつ、自分の町に戻ることができるためYesとなる。

Sample Input 2

4 4
1 2
2 3
2 4
3 4

Output for the Sample Input 2

No
No
No
No

どの段階においても、自分の町に戻るのに、同じ町・サイクリングロードを必ず2回以上通らなければならないため、全てNoである。

Solution in C (judge verdict: Accepted)

#include<stdio.h>
int MIN(int a,int b){return a<b?a:b;}
int ta[1010],to[100010],nt[100010],co[100010],F[1010];
int MF(int s,int t,int e,int min){
  if(s==t||min==0)return min;
  int i,r;
  F[s]=1;
  for(i=ta[s];i+1;i=nt[i]){
    if(F[to[i]])continue;
    r=MF(to[i],t,e,MIN(min,co[i]));
    co[i]-=r;
    co[(i+e)%(2*e)]+=r;
    if(r)return r;
  }
  return 0;
}
int maxf(int s,int t,int v,int e,int *a,int *b,int *c){
  int i,f,r;
  for(i=0;i<=v;i++)ta[i]=-1;
  for(i=0;i<e;i++){
    nt[i  ]=ta[to[i+e]=a[i]];
    nt[i+e]=ta[to[i  ]=b[i]];
    co[ta[a[i]]=i  ]=c[i];
    co[ta[b[i]]=i+e]=0;
  }
  for(i=0;i<=v;i++)F[i]=0;
  for(f=0;r=MF(s,t,e,1000000000);f+=r){
    if(f>1)return f;
    for(i=0;i<=v;i++)F[i]=0;
  }
  return f;
}
int main(){
  int n,m,i,r=0,a[100010],b[100010],c[100010],s,t;
  scanf("%d %d",&n,&m);
  for(i=1;i<=n;i++){
    a[r]=i;
    b[r]=i+n;
    c[r++]=1;
  }
  while(m--){
    scanf("%d %d",&s,&t);
    a[r]=s+n;
    b[r]=0;
    c[r]=1;
    a[r+1]=t+n;
    b[r+1]=0;
    c[r+1]=1;
    printf("%s\n",maxf(1+n,0,n*2+1,r+2,a,b,c)>1?"Yes":"No");
    a[r]=s+n;
    b[r]=t;
    c[r++]=1;
    a[r]=t+n;
    b[r]=s;
    c[r++]=1;
  }
  return 0;
}