ルーキー物流輸送ネットワーク

トピックリンク:新人物流と交通ネットワーク


新人物流はNN都市物流流通センターが含まれている独自のトランスポートネットワークを有し、及び都市間の輸送ルートのMMに(線が双方向です)。ルーキーは、物流淘宝網の売り手は、パッケージ自体の搬送経路を決定することができますが、唯一つの制限ルール:都市の後にノー繰り返し。街のAAから淘宝網の売り手暁明は、小包が後で街のb-b送らmidmid市での梱包や処理という希望を表明送りました。

今、スティーブは彼の正当な要求を満たすために搬送経路を計算したい、あなたは彼が何を把握することができますか?

このような既知の解決策が存在している必要があります。してください暁明出力可能なオプションのいずれか。

入力形式

T(1 \当量T \当量10)T(1≤T≤10)整数正の最初の行は、データセットの数を表します。

22の正の整数N、M(3 \当量のNの各セットの最初の行 \当量100、M \当量\ FRAC {N(N-1)} {2})N、M(3≤n≤100、M
2
N-(N - 1) )、及び数は、都市交通線の数を表します。

第二行33のファー異なる整数、B、中間(1 \当量A、B、中間\当量のN)、B、中間(1≤a、B、mid≤n)、開始点、終了点を表し、そして街への道。

22の正の整数のその後MM線は、Y(1 \当量X、Y \当量のN)X X、Y(1≤x、y≤n)、各ライン22に接続都市を表します。

データの各セットは、少なくとも合成方法の実施形態が存在しなければなりません。合法的な輸送暁明の需要を満たすために複数の経路がある場合は、出力いずれかとすることができます。

出力フォーマット

始点と終点を含む、都市を通して連続数を表す整数各データ出力LLの陽性。各二つの整数のスペース、最後に整数バックの間にスペースはありません。

この質問への唯一の答えは、答えの要件が正しい満たしていません

サンプル入力コピー
1
。5 5
。1. 5 3
1 2
2 3
3 4
4 5
5 1
サンプル出力コピー
12345


明白なアプローチは、中間点を列挙し、次に最大の流れのポイントを分割することであるが、TLEは、試みてはなりません。

しかし、実際に、それは双方向の側であるので、我々A - >中旬 - 中旬に相当> B - > A、半ば - > B.

その後、我々は最大流量をすることができます。

しかし、出力パスは少し面倒、とにかく、暴力をすることができます。コードチューン長い時間のための曲の出力パスは、Aのうち結果、WAが行われていない望んでいました

ACコード:

#pragma GCC optimize("-Ofast","-funroll-all-loops")
#include<bits/stdc++.h>
//#define int long long
using namespace std;
const int inf=0x3f3f3f3f;
const int N=210,M=1e6+10;
int n,m,s,t,h[N],A,B,mid;
int head[N],nex[M],to[M],w[M],tot;
inline void ade(int a,int b,int c){
	to[++tot]=b; nex[tot]=head[a]; w[tot]=c; head[a]=tot;
}
inline void add(int a,int b,int c){ade(a,b,c);	ade(b,a,0);}
inline void init(){
	tot=1;	t=n*2+1;	memset(head,0,sizeof head);
}
inline int bfs(){
	queue<int> q;	q.push(s);	memset(h,0,sizeof h);	h[s]=1;
	while(q.size()){
		int u=q.front();	q.pop();
		for(int i=head[u];i;i=nex[i]){
			if(w[i]&&!h[to[i]]){
				h[to[i]]=h[u]+1;	q.push(to[i]);
			}
		}
	}
	return h[t];
}
int dfs(int x,int f){
	if(x==t)	return f;	int fl=0;
	for(int i=head[x];i&&f;i=nex[i]){
		if(w[i]&&h[to[i]]==h[x]+1){
			int mi=dfs(to[i],min(w[i],f));
			w[i]-=mi,w[i^1]+=mi,fl+=mi,f-=mi;
		}
	}
	if(!fl)	h[x]=-1;
	return fl;
}
inline int dinic(){
	int res=0;
	while(bfs())	res+=dfs(s,inf);
	return res;
}
inline void solve(){
	cin>>n>>m>>A>>B>>mid;	init();
	for(int i=1;i<=n;i++)	add(i,i+n,1);
	for(int i=1,x,y;i<=m;i++)	cin>>x>>y,add(x+n,y,inf),add(y+n,x,inf);
	add(A+n,t,1),add(B+n,t,1),add(s,mid+n,2),dinic();
	int now=mid+n;	vector<int> v[2];
	while(now!=A&&now!=B){
		for(int i=head[now];i;i=nex[i]){
			if(now<=n){
				if(w[i^1]&&to[i]==now+n){now=to[i]; w[i^1]=0; break;}
			}else{
				if(w[i^1]&&to[i]<=n){now=to[i];	w[i^1]=0; break;}
			}
		}
		v[0].push_back(now);
	}
	now=mid+n;
	while(now!=A&&now!=B){
		for(int i=head[now];i;i=nex[i]){
			if(now<=n){
				if(w[i^1]&&to[i]==now+n){now=to[i]; w[i^1]=0; break;}
			}else{
				if(w[i^1]&&to[i]<=n){now=to[i];	w[i^1]=0; break;}
			}
		}
		v[1].push_back(now);
	}
	now=0;	if(v[1][v[1].size()-1]==A)	now++;
	for(int i=v[now].size()-1;i>=0;i-=2)	cout<<v[now][i]<<' ';
	cout<<mid<<' ';	now^=1;
	for(int i=0;i<v[now].size();i+=2)	cout<<v[now][i]<<' ';
	cout<<'\n';
}
signed main(){
	ios::sync_with_stdio(false),cin.tie(nullptr),cout.tie(nullptr);
	int T;	cin>>T;
	while(T--)	solve();
	return 0;
}
公開された489元の記事 ウォンの賞賛241 ・は 30000 +を見て

おすすめ

転載: blog.csdn.net/weixin_43826249/article/details/104108568