【悬赏3rmb】已AC,但不太理解赋值为何要这样赋值?
查看原帖
【悬赏3rmb】已AC,但不太理解赋值为何要这样赋值?
253765
houpingze楼主2024/8/8 17:23

如题,有没有巨佬能讲讲

获得3rmb的条件是把我讲懂()

具体而言,为什么 能按照强连通分量编号大小来赋值,以及 为什么 xix_i 应当赋值为 idx>idx+nid_x>id_{x+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;
}


2024/8/8 17:23
加载中...