看起来没有正确性,但是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;
}