Пример #1
0
int mincost_maxflow()
{
	piS = cost = 0;
	while(modlabel())
	{
		do
		{
			CLR(v,0);
		}while(aug(S, INF));
	}
    return -cost;
}
Пример #2
0
int main(){
	scanf("%d", &N);
	S = 0, T = 2 * N + 1;
	for(int i = 1; i < N; ++i){
		int x, y;
		scanf("%d%d", &x, &y);
		treeEdge[x].push_back(y);
		treeEdge[y].push_back(x);
	}
	
	getMark();
	for(int i = N; i > 1; --i){
		addedge(i, fa[i], T);
	}
	std::vector<std::pair<int, std::pair<int, int> > > rems;
	for(int i = 1; i <= N; ++i){
		int x, y;
		scanf("%d%d", &x, &y);
		if(depth[x] > depth[y]) std::swap(x, y);
		if(x == 1 || mark[x] == mark[y]){
			preQ[y].push(std::make_pair(depth[x], i));
		}
		else{
			addedge(S, N + i, 1);
			addedge(N + i, x, 1);
			addedge(N + i, y, 1);
			rems.push_back(std::make_pair(i, std::make_pair(x, y)));
		}
	}
	
	memset(vis, 0, sizeof(vis));
	if(!getPreDecide(1) || preQ[1].size()){
		printf("No\n");
		return 0;
	}
	for(int i = 1; i <= N; ++i){
		if(!decided[i]){
			addedge(i, T, 1);
		}
	}
	
	maxflow = 0;
	while(modlabel()){
		maxflow += aug(S, T);
	}
	if(maxflow != N - preDecide){
		printf("No\n");
		return 0;
	}
	for(int i = 1; i <= N; ++i){
		for(edge *ii = V[N + i]; ii; ii = ii -> nxt){
			if(ii -> u == 0 && ii -> t > 0 && ii -> t <= N){
				toDecide[ii -> t].push_back(i);
			}
		}
	}
	
	memset(vis, 0, sizeof(vis));
	getAnswer(1);
	
	printf("Yes\n");
	for(int i = 1; i <= N; ++i){
		printf("%d%c", ans[i], i == N ? '\n' : ' ');
	}
	
	return 0;
}
Пример #3
0
void costflow(int n)
{	while (modlabel(n))		do{	memset(vis,0,sizeof(vis));	}while(aug(s,INF));	}