傳送門
完了這題好厲害……字串什麼的好麻煩……
要求從$1$到$n$的路徑,不重複,經過邊數最多
每乙個點拆成兩個,$a_i,b_i$,然後$a_i$到$b_i$連容量為$1$,費用為$1$的邊,保證每個點只被選一次
然後$1$和$n$的話要容量為$2$
然後有連邊的話,$b_i$向$a_j$連邊,容量$1$,費用$1$
要選的點最多,那麼就是要費用最大,所以跑乙個最大費用流
然後找方案的話,直接dfs,然後正著和倒著輸出
有幾個細節,寫在**裡了
1//minamoto
2 #include3 #include4 #include5 #include6 #include7
#define inf 0x3f3f3f3f
8using
namespace
std;
9const
int n=5005,m=500005;10
int ver[m],next[m],head[n],edge[m],flow[m],tot=1;11
intdis[n],disf[n],pre[n],last[n],vis[n],maxflow,maxcost;
12int n,m,s,t;bool check=0
;13 queueq;
14 mapmp;
15string
name[n];
16 inline void add(int u,int v,int f,int
e)20
bool
spfa()32}
33}34return ~pre[t];35}
36void
dinic()44}
45}46int ans[1005];int num=0;47
void
out(int
u)55}56
}57intmain()
67for(int i=1;i<=m;++i)
74 add(1,n+1,1,1),add(n,n+n,1,1
);75 s=1,t=n+n;
76dinic();
77if(!maxflow||(maxflow==1&&!check)) return puts("
no solution!
"),0;78
if(maxflow==1&&check)
79 printf("
%d\n
",maxcost/2-1
);80
//這裡的最多城市數是這個
81//
因為考慮如果邊連成乙個環,邊數等於點數
82//
然後每個點拆成兩個,除以二
83//
然後因為s'和t'被重複了兩次,減去1
84out
(s);
85for(int i=1;i<=num;++i) if(ans[i]<=n) cout<'\n'
;86 num=0;87
out(s);
88for(int i=num-2;i;--i) if(ans[i]<=n) cout<'\n'
;89//最後兩個肯定是t和t',不用管
90return0;
91 }
洛谷 P2770 航空路線問題
給定一張航空圖,圖中頂點代表城市,邊代表 2 城市間的直通航線。現要求找出一條滿足下述限制條件的且途經城市最多的旅行路線。1 從最西端城市出發,單向從西向東途經若干城市到達最東端城市,然後再單向從東向西飛回起點 可途經若干城市 2 除起點城市外,任何城市只能訪問 1 次。對於給定的航空圖,試設計乙個...
洛谷P2770 航空路線問題 最大費用最大流
題目描述 給定一張航空圖,圖中頂點代表城市,邊代表 2 城市間的直通航線。現要求找出一條滿足下述限制條件的且途經城市最多的旅行路線。1 從最西端城市出發,單向從西向東途經若干城市到達最東端城市,然後再單向從東向西飛回起點 可途經若干城市 2 除起點城市外,任何城市只能訪問 1 次。對於給定的航空圖,...
P2770 航空路線問題(最大費用最大流)
題意 給定一張航空圖,圖中頂點代表城市,邊代表 2 城市間的直通航線。現要求找出一條滿足下述限制條件的且途經城市最多的旅行路線。1 從最西端城市出發,單向從西向東途經若干城市到達最東端城市,然後再單向從東向西飛回起點 可途經若干城市 2 除起點城市外,任何城市只能訪問 1 次。對於給定的航空圖,試設...