终于a了!!!我勒个去。。。往往在无数次wa后重敲一遍就能ac。。。这句话很经典~
找了个ac程序对拍,结果发现那个ac程序错了,但是我交那个程序居然能ac!!我擦!!poj数据弱爆了啊!!尼玛还是专门用来卡哥的??
poj上一句很欠扁的话啊,虽然哥的程序是错的,但就是能ac!。。。艹!!彻底瞎了!!!!
然后又找了个ac程序对拍,自己生成的随即数据都tm有80mb了啊!!!可是答案都是一样的,令我很纠结。。。我又交了一遍,还是wa,无语凝噎,然后和小爽去吃饭,他说他有很多题都是这样。。。思路清楚的一逼,就是wa。。。- -!尼玛ac一题和会做一题还真是不一样的概念啊!!╮(╯▽╰)╭
晚上继续debug。。。快崩溃了,这种没测试数据的题目刷的真难受。。。
我感觉我的找错能力灰常强的,为什么就是wa啊!!!
无奈之下重敲了一遍。。。。。
后面发现居然是一个地方的now写成s.back()了,我擦!!!!tmd劳资直接撞死算了!!!!
#include<iostream>
#include<vector>
#include<algorithm>
#include<cstdio>
#include<queue>
#include<stack>
#include<string>
#include<map>
#include<set>
#include<cmath>
#include<cassert>
#include<cstring>
#include<iomanip>
using namespace std;
#ifdef _WIN32
#define i64 __int64
#define out64 "%I64d\n"
#define in64 "%I64d"
#else
#define i64 long long
#define out64 "%lld\n"
#define in64 "%lld"
#endif
#define FOR(i,a,b) for( int i = (a) ; i <= (b) ; i ++)
#define FF(i,a) for( int i = 0 ; i < (a) ; i ++)
#define FFD(i,a) for( int i = (a)-1 ; i >= 0 ; i --)
#define S64(a) scanf(in64,&a)
#define SS(a) scanf("%d",&a)
#define LL(a) ((a)<<1)
#define RR(a) (((a)<<1)+1)
#define SZ(a) ((int)a.size())
#define PP(n,m,a) puts("---");FF(i,n){FF(j,m)cout << a[i][j] << ' ';puts("");}
#define pb push_back
#define CL(Q) while(!Q.empty())Q.pop()
#define MM(name,what) memset(name,what,sizeof(name))
#define read freopen("in.txt","r",stdin)
#define write freopen("out.txt","w",stdout)
const int inf = 0x3f3f3f3f;
const i64 inf64 = 0x3f3f3f3f3f3f3f3fLL;
const double oo = 10e9;
const double eps = 10e-10;
const double pi = acos(-1.0);
const int maxn = 1011;
int n,m;
vector<int>g[maxn];
vector<int>lk[maxn];
vector<int>s;
queue<int>q;
bool hash[maxn][maxn];
int dfn[maxn];
int low[maxn];
bool ins[maxn];
int col[maxn];
bool you[maxn];
bool can[maxn];
int t[maxn];
int df,nf;
int x,y;
bool ok;
int ans;
void tarjan(int now)
{
int to,temp;
dfn[now]=low[now]=df++;
s.push_back(now);
FF(i,g[now].size())
{
to=g[now][i];
if(to == t[now])
{
continue;
}
if(!dfn[to])
{
t[to]=now;
tarjan(to);
low[now]=min(low[to],low[now]);
if(dfn[now] <= low[to])
{
do{
temp = s.back();
lk[nf].push_back(temp);
s.pop_back();
}while(temp != to);
lk[nf++].push_back(now);
}
}
else
{
low[now]=min(low[now],dfn[to]);
}
}
}
void start()
{
MM(dfn,0);
for(int i=1;i<=n;i++)
{
low[i]=inf;
}
MM(ins,false);
MM(hash,false);
MM(t,-1);
MM(col,0);
MM(can,false);
FF(i,maxn)
{
lk[i].clear();
}
s.clear();
df=nf=1;
for(int i=1;i<=n;i++)
{
if(!dfn[i])
{
tarjan(i);
}
}
nf--;
int now,to;
for(int i=1;i<=nf;i++)
{
if(lk[i].size()<2)
{
continue;
}
MM(you,false);
MM(col,0);
CL(q);
FF(j,lk[i].size())
{
now=lk[i][j];
you[now]=true;
}
q.push(lk[i][0]);
col[lk[i][0]]=1;
ok = false;
while(!q.empty())
{
now=q.front();
q.pop();
FF(u,g[now].size())
{
to=g[now][u];
if(!you[to])
{
continue;
}
if(!col[to])
{
col[to]=-col[now];
q.push(to);
}
else if(col[now]==col[to])
{
ok=true;
break;
}
}
if(ok)
{
break;
}
}
if(ok)
{
FF(u,lk[i].size())
{
now=lk[i][u];
can[now]=true;
}
}
}
ans=0;
FOR(i,1,n)
{
if(!can[i])
{
ans++;
}
}
cout<<ans<<endl;
return ;
}
int main()
{
while(cin>>n>>m)
{
if(!n && !m)
{
break;
}
MM(hash,false);
FF(i,maxn)
{
g[i].clear();
}
for(int i=1;i<=m;i++)
{
cin>>x>>y;
hash[x][y] = true;
hash[y][x] = true;
}
FOR(i,1,n) FOR(j,1,n)
{
if(i == j)
{
continue;
}
if(!hash[i][j])
{
g[i].push_back(j);
}
}
start();
}
return 0;
}