如题,有没有巨佬能讲讲
获得3rmb的条件是把我讲懂()
具体而言,为什么 能按照强连通分量编号大小来赋值,以及 为什么 xi 应当赋值为 idx>idx+n
这是我的代码
#include<bits/stdc++.h>
#define MN 114514
#define reg register int
#define INF (1<<30)
#define pb push_back
#define vc vector
#define fst first
#define scd second
//#define int long long
#define rep(i,x,y) for(int i=x;i<=y;i++)
using namespace std;
int read(){
int res=0,fs=1; char c=getchar();
while(!(c>='0' && c<='9')){ if(c=='-')fs=-1; c=getchar(); }
while(c>='0' && c<='9')res=res*10+c-'0',c=getchar();
return res*fs;
}
void print(int x){
if(x<0) { putchar('-'); x=-x;}
if(x>9) print(x/10);
putchar(x%10+'0');
}
int n,cnt,m,a[500010],ans,tmp,k;
typedef pair<int,int> P;
//struct PROBLEM_SOLVER{
// int n,m;
//}solver;
//signed main(){
void py(){
cout<<"YES\n";
}
void pn(){
cout<<"NO\n";
}
vector<int>G[2000005];
int dfn[2000500],low[2101001];
int tot;
int t[2101010];
stack<int>s;
int vis[2020200];
void tarjan(int x){
cnt++;
vis[x]=1;
dfn[x]=low[x]=cnt;
s.push(x);
for(int i=0;i<G[x].size();i++){
int u=x,v=G[x][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[x]==dfn[x]){
tot++;
while(1){
int h=s.top();
s.pop();
vis[h]=0;
t[h]=tot;
if(h==x) break;
}
}
}
int main() {
//ios::sync_with_stdio(false);
cin>>n>>m;
rep(i,1,m){
int a=read(),x=read(),b=read(),y=read();
if(x&&y){
G[a].pb(b+n);
G[b].pb(a+n);
}else if(y){//a=0 or b=1
G[b].pb(a);
G[a+n].pb(b+n);
}else if(x){
G[a].pb(b);
G[b+n].pb(a+n);
}else {
G[a+n].pb(b);
G[b+n].pb(a);
}
}
rep(i,1,n*2)
if(!dfn[i])
tarjan(i);
rep(i,1,n){
if(t[i]==t[i+n]){
cout<<"IMPOSSIBLE";
return 0;
}
}
cout<<"POSSIBLE\n";
rep(i,1,n){
cout<<(t[i]>t[i+n])<<' ';
}
return 0;
}