求hack
查看原帖
求hack
289230
ricky0916楼主2024/1/22 08:29

看起来没有正确性,但是AC了。

#include<bits/stdc++.h>
using namespace std;
int t,n,m,match[510],m2[510],bian[510][510],bian2[510][510],ui,vi,ci,now,dp[510][510][2],wujie[510][2];
vector<int>g[510];
bool vis[510];
bool find(int x){
	for(int i=0;i<g[x].size();i++){
		int v=g[x][i];
		if(!vis[v]){
			vis[v]=1;
			if(match[v]<0||find(match[v])){
				match[v]=x;
				m2[x]=v;
				return 1;
			}
		}
	}
	return 0;
}
bool find2(int x,bool bi){
	if(wujie[x][bi]) return 0;
	for(int i=0;i<g[x].size();i++){
		int v=g[x][i];
		if(match[v]!=x){
			vis[x]=1;
			if(match[v]==now){
				if(bian[x][m2[x]]^bian[x][v]==bi){
					match[v]=x;
					return 1;
				}
			}
			else if(vis[match[v]]||dp[x][v][bi]==0){
				//if(dp[x][v][bi]!=0) cout<<0<<endl;
				dp[x][v][bi]=0;
				continue;
			}
			else if(find2(match[v],bi^bian[x][m2[x]]^bian[x][v])){
				match[v]=x;
				return 1;
			}
			dp[x][v][bi]=0;
			//cout<<0<<endl;
		}
	}
	vis[x]=0;
	wujie[x][bi]=1;
	return 0;
}
int main(){
	scanf("%d",&t);
	while(t--){
		scanf("%d%d",&n,&m);
		memset(bian,-1,sizeof(bian));
		for(int i=1;i<=m;i++){
			scanf("%d %d %d",&ui,&vi,&ci);
			g[ui].push_back(vi-n);
			bian[ui][vi-n]=ci;
			bian2[ui][vi-n]=i;
		}
		memset(match,-1,sizeof(match));
		int ans=0;
		for(int i=1;i<=n;i++){
			memset(vis,0,sizeof(vis));
			if(find(i)) ++ans;
		}
		
		if(ans!=n) printf("-1\n");
		else{
			bool flag=0;
			for(int i=1;i<=n;i++) flag^=bian[match[i]][i];
			if(flag){
				bool can=0;
				for(int i=1;i<=n;i++){
					for(int j=1;j<=n;j++){
						for(int k=1;k<=n;k++){
							dp[j][k][0]=dp[j][k][1]=-1;
						}
						wujie[j][0]=wujie[j][1]=0;
					}
					now=i;
					memset(vis,0,sizeof(vis));
					if(find2(i,1)){
						can=1;
						break;
					}
				}
				if(can){
					for(int i=1;i<=n;i++) printf("%d ",bian2[match[i]][i]);
					printf("\n");
				}
				else printf("-1\n");
			}
			else{
				for(int i=1;i<=n;i++) printf("%d ",bian2[match[i]][i]);
				printf("\n");
			}
		}
		for(int i=1;i<=n;i++) g[i].clear();
	}
	return 0;
}
2024/1/22 08:29
加载中...