为什么re啊啊啊
查看原帖
为什么re啊啊啊
568775
Joseph_H楼主2022/10/10 15:25

6个re5个t

我知道裸的dfs走km会t

但是为什么RE啊?
#include<bits/stdc++.h>
using namespace std;
const int N = 1010;
const int INF = 0x3f3f3f3f;
struct node{
	int to;
	int val;
};
vector <node> v[N];
int n,m;
int ex_l[N];    
int ex_r[N];    
bool vis_l[N];   
bool vis_r[N];    
int match[N];        
int slack[N];
int way[N];
bool dfs(int l){
	vis_l[l] = 1;
	for(int i = 0;i < v[l].size();i++){
		int r = v[l][i].to;
		if(vis_r[r]) continue;
		if(ex_l[l] + ex_r[r] == v[l][i].val){
			vis_r[r] = 1;
			if(match[r] == -1 || dfs(match[r])){
				match[r] = l;
				way[l] = v[l][i].val;
				return 1;
			} 
		}
		else{
			slack[r] = min(slack[r],ex_l[l] + ex_r[r] - v[l][i].val);
		}
	}
} 
int km(){
	memset(match,-1,sizeof(match));
	memset(ex_l,0,sizeof(ex_l));
	for(int i = 1;i <= n;i++){
		for(int j = 0;j < v[i].size();j++){
			ex_l[i] = max(ex_l[i],v[i][j].val);
		}
	}
	for(int i = 1;i <= n;i++){
		fill(slack,slack + n,INF);
//		cout<<"??"<<endl;
		while(1){
			memset(vis_l,false,sizeof(vis_l));
			memset(vis_r,false,sizeof(vis_r));
			if(dfs(i)) break;
			int d = INF;
			for(int j = 1;j <= n;j++){
				if(!vis_r[j]) d = min(d,slack[j]);
			}
			for(int j = 1;j <= n;j++){
				if(vis_l[j]) ex_l[j] -= d;
				if(vis_r[j]) ex_r[j] += d;
				else slack[j] -= d;
			}
		}
	}
	int res = 0;
	for(int i = 1;i <= n;i++){
		res += way[match[i]];
	}
	printf("%d\n",res);
	for(int i = 1;i <= n;i++){
		printf("%d ",match[i]);
	}
}
int main(){
	scanf("%d%d",&n,&m);
	for(int i = 1;i <= m;i++){
		int a,b,c;
		node d;
		scanf("%d%d%d",&a,&b,&c);
		d.to = b;
		d.val = c;
		v[a].push_back(d);
	}
	km();
}
2022/10/10 15:25
加载中...