呃。。。为什么会RE?
查看原帖
呃。。。为什么会RE?
380950
2020wty楼主2024/1/28 10:31
#include<iostream>
#include<cstdio>
#include<cstring>
#define re register int
#define il inline
using namespace std;
const int N=505;
bool co[N*N],vis[N*2],bz[N+N][2],mapp[N+N][N+N],vs[N+N][2];
int T,n,x,y,m,c,pd[N+N][N+N],pre[N+N],ans[N],top,stk[(N+N)*114];
il bool Hungary(int now){
	for(int i=1+n;i<=n+n;i++){
		if(pd[now][i]){
			if(!vis[i]){
				vis[i]=1;
				if(!pre[i]){
					pre[i]=now;
					return 1;
				}
				else{
					if(Hungary(pre[i])){
						pre[i]=now;
						return 1;
					}
				}
			}
		}
	}
	return 0;
}
il bool Search(int now,bool v){
	if(vs[now][v])return 0;
	bz[now][v]=1;
	vs[now][v]=1;
	bool f=v;
	if(now<=n){
		for(int i=n+1;i<=n+n;i++){
			if(mapp[now][i]||!pd[now][i])continue;
			bool tov=v^co[pd[now][i]];
			if(bz[i][!tov]){
				int To=i;
				while(stk[top]!=i){
//					cout<<stk[top]<<" ";
					mapp[stk[top]][To]^=1;
					mapp[To][stk[top]]^=1;
					To=stk[top];
					top--;
				}
//				cout<<endl;
				mapp[i][To]^=1;
				mapp[To][i]^=1;
				top--;
				return 1;
			}
			top++;
			stk[top]=i;
			if(Search(i,tov)){
				return 1;
			}
			top--;
		}
		bz[now][f]=0;
		return 0;
	}
	else{
		for(int i=1;i<=n;i++){
			if(mapp[now][i]||!pd[now][i])continue;
			bool tov=v^co[pd[now][i]];
			if(bz[i][!tov]){
				int To=i;
//				cout<<"fsg"<<endl;
				while(stk[top]!=i){
//					cout<<stk[top]<<" ";
					mapp[stk[top]][To]^=1;
					mapp[To][stk[top]]^=1;
					To=stk[top];
					top--;
				}
				cout<<endl;
				mapp[i][To]^=1;
				mapp[To][i]^=1;
				top--;
				return 1;
			}
			top++;
			stk[top]=i;
			if(Search(i,tov)){
				return 1;
			}
			top--;
		}
		bz[now][f]=0;
		return 0;
	}
}
int main(){
	scanf("%d",&T);
	while(T--){
		memset(pd,0,sizeof(pd));
		memset(co,0,sizeof(co));
		memset(pre,0,sizeof(pre));
		memset(mapp,0,sizeof(mapp));
		memset(vs,0,sizeof(vs));
		scanf("%d%d",&n,&m);
		for(re i=1;i<=m;i++){
			scanf("%d%d%d",&x,&y,&c);
			pd[x][y]=i;
			pd[y][x]=i;
			mapp[y][x]=1;
			co[i]=c;
		}
		bool g=0;
		for(re i=1;i<=n;i++){
			memset(vis,0,sizeof(vis));
			if(!Hungary(i)){
//				cout<<i<<endl;
				g=1;
				break;
			}
		}
		if(g){
			printf("-1\n");
			continue;
		}
		for(re i=1;i<=n;i++){
			ans[i]=pd[pre[i+n]][i+n];
			g=g^co[ans[i]];
			mapp[pre[i+n]][i+n]=1;
			mapp[i+n][pre[i+n]]=0;
		}
		if(!g){
			for(re i=1;i<=n;i++)printf("%d ",ans[i]);
			printf("\n");
			continue;
		}
//		cout<<"fdsgfsdg"<<endl;
//		for(re i=1;i<=n;i++)cout<<i+n<<" "<<pre[i+n]<<endl;
		g=0;
		memset(bz,0,sizeof(bz));
		top=0;
		for(re i=1;i<=n;i++){
			if(Search(i,0)){
				g=1;
				break;
			}
		}
		if(!g){
			printf("-1\n");
			continue;
		}
		for(re i=1;i<=n;i++){
			for(re j=1;j<=n;j++){
				if(mapp[i][j+n])printf("%d ",pd[i][j+n]);
			}
		}
		printf("\n");
	}
	return 0;
}
2024/1/28 10:31
加载中...