博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
bzoj1242(弦图判定)
阅读量:7199 次
发布时间:2019-06-29

本文共 1882 字,大约阅读时间需要 6 分钟。

cdqppt地址:https://wenku.baidu.com/view/a2bf4ad9ad51f01dc281f1df.html;

代码实现参考的http://blog.csdn.net/u014609452/article/details/51447533;

这个代码实现还是很妙的,为了快速找到label值最大的节点,新建虚拟节点n+1+i,连向所有label等于i的点;

#include
#include
#include
#include
#include
using namespace std;const int maxn=1005,maxm=5000005;struct edg{ int to,nxt;}e[maxm];int f[maxn],best,n,m,last[maxn<<1],t,vis[maxn],seq[maxn];void add(int x,int y){++t;e[t].nxt=last[x];last[x]=t;e[t].to=y;}void mcs(){ for(int i=1;i<=n;++i) add(n+1,i); for(int s=n;s;--s){ while(1){ int v=0; for(int i=last[n+1+best];i&&!v;i=e[i].nxt){ if(!vis[e[i].to]){ v=e[i].to; } else last[best+n+1]=e[i].nxt; } if(v){ vis[v]=1;seq[s]=v; for(int i=last[v];i;i=e[i].nxt) if(!vis[e[i].to]){ f[e[i].to]++; add(f[e[i].to]+n+1,e[i].to); best=max(best,f[e[i].to]); } break; } else best--; } }}bool can[maxn][maxn];int rk[maxn],x,y,cnt,tmp[maxn];int main(){ cin>>n>>m; for(int i=1;i<=m;++i){ scanf("%d%d",&x,&y); add(x,y);add(y,x); can[x][y]=can[y][x]=1; } mcs(); for(int i=1;i<=n;i++)rk[seq[i]]=i; for(int i=n;i;i--){ int x=seq[i];cnt=0; for(int j=last[x];j;j=e[j].nxt){ if(rk[e[j].to]>rk[x])tmp[++cnt]=rk[e[j].to]; } sort(tmp+1,tmp+cnt+1); for(int i=2;i<=cnt;++i){ if(!can[seq[tmp[1]]][seq[tmp[i]]]) {puts("Imperfect\n");return 0;} } } printf("Perfect\n"); return 0;}

 

转载于:https://www.cnblogs.com/dibaotianxing/p/8311039.html

你可能感兴趣的文章
[Linux] Big-endian and Little-endian (大小端模式)
查看>>
非父子组件生命周期的关系
查看>>
web crawling(plus6) pic mining
查看>>
01Hadoop简介
查看>>
树莓派上搭建唤醒词检测引擎 Snowboy
查看>>
hdu 3635 Dragon Balls(并查集技巧)
查看>>
算法和策略之间的混沌关系
查看>>
让 OpenAL 也支持 S16 Planar(辅以 FFmpeg)
查看>>
单例初始化宏定义
查看>>
删除字符串中某字符
查看>>
1.下载方式
查看>>
最小割
查看>>
通过源码分析View的测量
查看>>
python列表的增删改查
查看>>
IOS设计模式之二:Delegate模式
查看>>
express+模板引擎构建项目时遇到的几个小问题
查看>>
module.export与export的区别?
查看>>
高级软件工程实践总结
查看>>
记---------我实习的第一天
查看>>
拓扑排序
查看>>