| ||||||||||
| Online Judge | Problem Set | Authors | Online Contests | User | ||||||
|---|---|---|---|---|---|---|---|---|---|---|
| Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest | |||||||||
Re:求能卡掉这代码的数据In Reply To:求能卡掉这代码的数据 Posted by:511818218 at 2013-09-26 14:51:47 > #include<cstdio>
> #include<iostream>
> #include<cstring>
> #include<algorithm>
> using namespace std;
>
> const int N=3000115,M=2005;
> int tot,C,p,n,m,ans,head[M],next[N],ver[N],dfn[M],low[M],num,stack[M],sat[M][M],col[M],q[M],g[M];
> bool v[M],in[M],map[M][M];
>
> void add(int x,int y)
> {
> ver[++tot]=y;next[tot]=head[x];head[x]=tot;
> ver[++tot]=x;next[tot]=head[y];head[y]=tot;
> }
>
> void tarjan(int x,int parent)
> {
> dfn[x]=low[x]=++num;
> stack[++p]=x;
> int i,y;
> for(i=head[x];i!=-1;i=next[i])
> {
> if(ver[i]==parent) continue;
> if(dfn[y=ver[i]])
> {
> low[x]=min(low[x],dfn[y]);
> continue;
> }
> if(!dfn[y])
> {
> tarjan(y,x);
> low[x]=min(low[x],low[y]);
> }
> if(dfn[x]<=low[y])
> {
> sat[++C][0]=1;
> sat[C][sat[C][0]]=x;
> while(1)
> {
> y=stack[p--];
> if(y==x){p++;break;}
> sat[C][++sat[C][0]]=y;
> }
> }
> }
> }
>
> void check(int x)
> {
> bool flag=0;
> int i,a,b,l,r;
> memset(in,0,sizeof(in));
> memset(col,-1,sizeof(col));
> memset(g,-1,sizeof(g));
> for(i=1;i<=sat[x][0];i++) in[sat[x][i]]=1;
> q[l=r=0]=sat[x][1];
> col[q[l]]=1;
> while(l<=r)
> {
> a=q[l++];
> for(i=head[a];i!=-1;i=next[i])
> {
> if(ver[i]==g[l-1]) continue;
> if(in[b=ver[i]])
> {
> if(col[b]==-1)
> {
> col[b]=col[a]^1;
> q[++r]=b;
> g[r]=a;
> }
> else if(col[b]==col[a])
> {
> flag=1;
> break;
> }
> }
> }
> if(flag) break;
> }
> //cout<<x<<' '<<flag<<endl;
> if(flag)
> {
> for(i=1;i<=sat[x][0];i++)
> v[sat[x][i]]=1;
> }
> }
>
> int main()
> {
> int i,j,x,y;
> while(scanf("%d%d",&n,&m)&&n&&m)
> {
> memset(head,-1,sizeof(head));
> memset(v,0,sizeof(v));
> memset(map,0,sizeof(map));
> memset(dfn,0,sizeof(dfn));//= =我用dfn做判断条件忘了清了
> memset(low,0,sizeof(low));
> memset(sat,0,sizeof(sat));
> memset(stack,0,sizeof(stack));
> tot=-1;
> for(i=1;i<=m;i++)
> {
> scanf("%d%d",&x,&y);
> map[x][y]=map[y][x]=1;
> }
> for(i=2;i<=n;i++)
> for(j=i-1;j;j--)
> if(!map[i][j])
> add(i,j);
> p=C=num=ans=0;
> for(i=1;i<=n;i++)
> if(!dfn[i])
> tarjan(i,-1);
> /*
> for(i=1;i<=C;i++)
> {
> for(j=1;j<=sat[i][0];j++)
> cout<<sat[i][j]<<' ';
> puts("");
> }
> */
> for(i=1;i<=C;i++)
> check(i);
> for(i=1;i<=n;i++)
> if(!v[i]) ans++;
> printf("%d\n",ans);
> }
> }
退栈的时候退掉y后就退出。第一次写真是写脑残了,4个半小时我擦擦擦啊
Followed by:
Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator