int stk[N],vis[N],low[N],link[N],mark[N];
int top,index,id,du[N];//记录入度数
int pre[N],cnt,g[N];// g 用来记录topsort后的结果
int g1[N]; //用来记录缩点后的每一个点所含的点 void dfs(int s)
{
mark[s]=;
vis[s]=index++;
low[s]=vis[s];
stk[top++]=s;
for(int p=pre[s];p!=-;p=edge[p].next)
{
int v=edge[p].to;
if(mark[v]==) dfs(v);
if(mark[v]==) low[s]=min(low[s],low[v]);
}
if(low[s]==vis[s])
{
int tmp;
id++;
do
{
tmp=stk[top-];
link[tmp]=id;
mark[tmp]=-;
}while(stk[--top]!=s);
}
} void add_edge(int u,int v)
{
edge[cnt].from=u;
edge[cnt].to=v;
edge[cnt].next=pre[u];
pre[u]=cnt++;
} void topsort()
{
memset(mark,,sizeof(mark));
top=;
int tcnt=;
for(int i=;i<=id;i++)
if(du[i]==)
{
mark[i]=;
stk[top++]=i;//把这个节点入栈
g[tcnt++]=i;
}
while(top!=)
{
int cur=stk[--top];
for(int p=pre[cur];p!=-;p=edge[p].next)
{
int v=edge[p].to;
if(mark[v]==) continue;
du[v]--;
if(du[v]==)
{
mark[v]=;
stk[top++]=v;
g[tcnt++]=v;
}
}
} } void dfs1(int s) //将所有不可能的情况标记
{
mark[s]=-;
for(int p=pre[s];p!=-;p=edge[p].next)
{
int v=edge[p].to;
dfs1(v);
}
} void sat2(int sn) //top 表示传入的点数。 其中要保证标号从0开始而且0和1是一组
{
top=index=id=;
memset(mark,,sizeof(mark));
for(int i=;i<sn;i++)
if(mark[i]==)
dfs(i);
int flag=;
for(int i=;i<sn;i+=)
{
if(link[i]==link[i+])
{
flag=;
break;
}
}
if(flag)
{
/* 当不可行的时候输出 */
printf("bad luck\n");
}
else
{
/* 可行的时候输出 */
printf("YES\n"); int tcnt=cnt;
memset(g1,,sizeof(g1));
cnt=;
memset(pre,-,sizeof(pre));
for(int i=;i<sn;i++)
{
g1[ link[i] ]=i;
} memset(du,,sizeof(du)); for(int i=;i<tcnt;i++)
{
int x=edge[i].from;
int y=edge[i].to;
if(link[x] != link[y])
{
add_edge(link[y],link[x]);//建逆图
du[ link[x] ]++;
}
}
topsort();
memset(mark,,sizeof(mark)); for(int i=;i<id;i++)
{
if(mark[ g[i] ]!=-)//表示这个点可以选
{
mark[ g[i] ]=;
int key=g1[ g[i] ];
key=key^;
key=link[key];
dfs1(key);
}
}
/* print mark[ link[i] ]==1 的表示可选的 */ }
}

最新文章

  1. python字符串内容替换的方法(转载)
  2. careercup-中等难度 17.5
  3. POJ 2135 Farm Tour
  4. awk的日志模块追加日期时间字段的方案
  5. Linux命令(持续更新中)
  6. jquery-bootgrid
  7. [物理学与PDEs]第1章习题8 磁场分布 $\ra$ 电流分布
  8. poj 3273&quot;Monthly Expense&quot;(二分搜索+最小化最大值)
  9. LeetCode(169. 求众数)
  10. 【PAT】B1038 统计同成绩学生(20)(20 分)
  11. jQuery File Upload 判断图片尺寸,限定图片宽高的办法
  12. Android在开发中的使用技巧之解决ScrollView嵌套RecyclerView出现的系列问题
  13. nginx+php+memcache实现hash一致性memcache 集群
  14. 02_数据库基础之(二)sql语句入门
  15. Spring Boot使用JWT实现系统登录验证
  16. 重命名和重定向RF执行生成的output文件
  17. mysqlint类型的长度值mysql在建表的时候int类型后的长度代表什么
  18. jQuery基础(常用插件 表单验证,图片放大镜,自定义对象级,jQuery UI,面板折叠)
  19. Php发送post请求方法
  20. multiprocessor(中)

热门文章

  1. ip范围生成 C#
  2. Sphinx-实战
  3. PHP连接Azure Redis
  4. Objective-C之定义函数
  5. Task WaitAll的用法
  6. atitit.eclipse有多少api&#160;&#160;扩展点,以及扩展点的设计
  7. Python学习笔记7:函数对象及函数对象作參数
  8. python对象序列化之pickle
  9. love2d教程34--thread模块
  10. apply 判定变量类型