您的位置:首页 > 其它

[BZOJ]1242: Zju1015 Fishing Net弦图判定

2017-05-15 19:51 337 查看
弦图判定,题目没有骗你

#include <cstdio>
using namespace std;
#define F(x) (x+1+n)

inline int max(int a,int b)
{
return a>b?a:b;
}

inline char tc(void)
{
static char fl[10000],*A=fl,*B=fl;
return A==B?B=(A=fl)+fread(fl,1,10000,stdin),A==B?EOF:*A++:*A++;
}

inline int read(void)
{
int a=0,f=1;static char c;
while((c=tc())<'0'||c>'9')c=='-'?f=-1:0;
while(c>='0'&&c<='9')
a=a*10+c-'0',c=tc();
return a*f;
}

struct Edge
{
int to;
Edge *next;
}edge[2002010],*link[2010];
int n,m,cnt,que[1010],t,w[1010],f[1010],v,best;
bool vis[1010],b[1010][1010];

int main(void)
{
register int i,j,x,y;
n=read(),m=read();
for (i=1;i<=m;++i)
x=read(),y=read(),b[x][y]=b[y][x]=1,
edge[++cnt].to=y,edge[cnt].next=link[x],link[x]=&edge[cnt],
edge[++cnt].to=x,edge[cnt].next=link[y],link[y]=&edge[cnt];
for (i=1;i<=n;++i)
edge[++cnt].to=i,edge[cnt].next=link[n+1],link[n+1]=&edge[cnt];
for (i=n;i;--i)
{
while(1)
{
v=0;
for (Edge *k=link[F(best)];k&&!v;k=k->next)
{
if(!vis[k->to])
v=k->to;
else
link[F(best)]=k->next;
}
if(v)
{
vis[v]=1,que[i]=v;
for (Edge *k=link[v];k;k=k->next)
if(!vis[k->to])
++f[k->to],edge[++cnt].to=k->to,edge[cnt].next=link[F(f[k->to])],link[F(f[k->to])]=&edge[cnt],best=max(best,f[k->to]);
break;
}
else
--best;
}
}
for (int i=1;i<=n;i++) w[que[i]]=i;
for (i=n;i;--i)
{
t=n+1;
for (Edge *k=link[que[i]];k;k=k->next)
if(w[k->to]>i&&w[k->to]<t)
t=w[k->to];
if(t==n+1)
continue;
for (Edge *k=link[que[i]];k;k=k->next)
if(w[k->to]>t)
if(!b[que[t]][k->to])
return puts("Imperfect"),0;
}
puts("Perfect");
return 0;
}

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: