社区讨论
奇妙写法
P5782[POI 2001] 和平委员会参与者 2已保存回复 1
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 1 条
- 当前快照
- 1 份
- 快照标识符
- @lwqg5pid
- 此快照首次捕获于
- 2024/05/28 21:42 2 年前
- 此快照最后确认于
- 2024/05/29 12:52 2 年前
同机房有一哥们,他把每个人拆成两个节点,表示去和不去,但是他没有AC,我们无法理解。
代码
CPP#include<bits/stdc++.h>
using namespace std;
int n,m;
int head[2000005*4],ver[2000005*4],Next[2000005*4],tot;
int dfn[2000005*2],low[2000005*2],c[2000005*2],c2[2000005*2],cnt,scccnt;
bitset<2000005*2>vis;
bitset<2000005*2>vis2;
stack<int>sta;
void add(int u,int v)
{
Next[++tot]=head[u],ver[tot]=v,head[u]=tot;
//cout<<u<<"-->"<<v<<endl;
}
void tarjan(int u)
{
dfn[u]=low[u]=++cnt;
sta.push(u);
vis[u]=1;
for(int i=head[u];i;i=Next[i])
{
int v=ver[i];
if(!dfn[v])
{
tarjan(v);
low[u]=min(low[u],low[v]);
}
else if(vis[v])low[u]=min(low[u],dfn[v]);
}
if(low[u]==dfn[u])
{
int k;
++scccnt;
while(!sta.empty())
{
k=sta.top();
sta.pop();
c[k]=scccnt;
c2[k]=dfn[u];
vis[k]=0;
if(k==u)break;
}
}
}
int main()
{
ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
cin>>n>>m;
for(int i=1;i<=2*n;i+=2)
{
int x=i,y=i+1;
add(x,y+2*n);
add(y+2*n,x);
add(x+2*n,y);
add(y,x+2*n);
}
for(int i=1;i<=m;i++)
{
int u,v;
cin>>u>>v;
add(u,v+2*n);
add(v,u+2*n);
}
for(int i=1;i<=4*n;i++)if(!dfn[i])tarjan(i);
for(int i=1;i<=2*n;i++)if(c[i]==c[i+2*n])
{
cout<<"NIE";
return 0;
}
for(int i=1;i<=2*n;i++)
{
if(c[i]>c[i+2*n])
{
vis2[i]=1;
}
}
for(int i=1;i<=2*n;i+=2)
{
if(vis2[i]==vis2[i+1])
{
cout<<"NIE";
return 0;
}
}
for(int i=1;i<=2*n;i++)
{
if(vis2[i])
{
cout<<i<<endl;
}
}
return 0;
}
回复
共 1 条回复,欢迎继续交流。
正在加载回复...