トピックリンク:新人物流と交通ネットワーク
新人物流は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;
}