28分求调
查看原帖
28分求调
541173
2021王艺乔楼主2025/1/12 16:06
#include<bits/stdc++.h>
#define ll long long
using namespace std;
ll m=200010,inf=10000000000000,n,s,t,tot,ans[2005];
ll l,r=1000,mid,u[2005],v[2005],w1[2005],w2[2005];
ll dep[10010],cur[10010],deg[10005];
struct node{
	ll v,w,id,wt;
};
vector<node>e[10010];
vector<int>g[10005],h[10005];
bool vis[100005];
bool bfs()
{
	memset(dep,-1,sizeof(dep));
	queue<ll>q;
	q.push(s);
	dep[s]=0;
	while(!q.empty()){
		ll f=q.front();
		q.pop();
		for(int i=0;i<e[f].size();i++){
			ll v=e[f][i].v;
			if(dep[v]==-1&&e[f][i].w){
				dep[v]=dep[f]+1;
				q.push(v);
			}
		}
	}
	memset(cur,0,sizeof(cur));
	return(dep[t]!=-1);
}
ll dfs(ll u,ll liu){
	if(u==t){
		return liu;
	}
	for(int i=cur[u];i<e[u].size();i++){
		cur[u]=i;
		ll v=e[u][i].v;
		if(dep[v]==dep[u]+1&&e[u][i].w){
			ll f=dfs(v,min(e[u][i].w,liu));
			if(f){
				e[u][i].w-=f;
				e[v][e[u][i].id].w+=f;
				return f;
			}
			else
				dep[v]=-1;
		}
	}
	return 0;
}
ll dinic(){
	ll r=0,flow;
	while(bfs()){
		while(flow=dfs(s,inf)){
			r+=flow;
		}
	}
	return r;
}
void add(ll u,ll v,ll w){
	ll ui=e[u].size();
	ll vi=e[v].size();
	e[u].push_back({v,1,vi,1});
	e[v].push_back({u,0,ui,0});
}
bool check(ll mid){
	for(int i=0;i<=n+m;i++){
		e[i].clear();
	}
	s=0;
	t=n+m+1;
	for(int i=1;i<=m;i++){
		if(w1[i]>mid&&w2[i]>mid){
			return 0;
		}
		add(s,i,1);
		if(w1[i]<=mid){
			add(i,m+u[i],1);
		}
		if(w2[i]<=mid){
			add(i,m+v[i],1);
		}
	}
	for(int i=1;i<=n;i++){
		add(m+i,t,deg[i]/2);
	}
	return (dinic()==m);
}
void dfs2(int u){
	for(int i=0;i<g[u].size();i++){
		int v=g[u][i];
		if(vis[h[u][i]]){
			continue;
		}
		vis[h[u][i]]=1;
		cout<<h[u][i]<<" ";
		dfs2(v);
//		ans[++tot]=h[u][i];
	}
}
void write(){
	cout<<l<<"\n";
	check(l);
	for(int i=1;i<=m;i++){
		for(int j=0;j<e[i].size();j++){
			if(e[i][j].w==0&&e[i][j].wt){
				if(e[i][j].v==u[i]+m){
					g[u[i]].push_back(v[i]);
					h[u[i]].push_back(i);
				}
				if(e[i][j].v==v[i]+m){
					g[v[i]].push_back(u[i]);
					h[v[i]].push_back(i);
				}
			}
		}
	}
	dfs2(1);
//	for(int i=tot;i;i--){
//		cout<<ans[i]<<" ";
//	}
	return;
}
int main()
{
	ios::sync_with_stdio(0);
	cin.tie(0);
	cout.tie(0);
	cin>>n>>m;
	for(int i=1;i<=m;i++){
		cin>>u[i]>>v[i]>>w1[i]>>w2[i];
		deg[u[i]]++;
		deg[v[i]]++;
//		l=min(l,min(w1[i],w2[i]));
//		r=max(r,max(w1[i],w2[i]));
	}
	l=1,r=1000;
	for(int i=1;i<=n;i++){
		if(deg[i]&1){
			cout<<"NIE";
			return 0;
		}
	}
	while(l<r){
		mid=(l+r)/2;
		if(check(mid)){
			r=mid;
		}
		else{
			l=mid+1;
		}
	}
	write();
	return 0;
}
2025/1/12 16:06
加载中...