航空路線 題解

2021-08-25 11:38:43 字數 1532 閱讀 5907

一道既可以dp又可以網路流的題

戳首先為了儲存狀態,最容易想到的就是狀態壓縮,但是資料範圍不允許我們壓縮,所以就要換思路。最簡單的,就會想到,我們並不關心狀態是什麼,而關心的是狀態是否合法。我們只要讓當前這個dp是合法的,他的轉移是合法的,他的轉移又不會影響到他已經合法的狀態,那麼這樣就可以了。

那麼dp就要表示出來合法的是哪一段。

我們又發現,狀態之所以不合法,就是因為來時的路與去時的路會有相同的城市。這樣就不能先dp去時的路再dp來時的路,要一起搞。dp又是逐漸向右走的。相當於選兩條互不相交的起點,終點確定的路。所以表示出兩條路分別走到**,並且分別走到的這兩段都沒有交集,這個用 dp

[i][

j]d p[

i][j

]表示。然後轉移出去就用i,j中的乙個向外走一步。但是走到的點一定要大於max(i,j),這樣才能保證接下來的狀態合法

#include

using

namespace

std;

template

inline

void read(t&data)

return;

}template

inline

void write(r data)

const

int _ =501,__ = 400101;

struct zjy dp[_][_];

int n,m;

string f1[_];

map f2;

int to[__<<1],nxt[__<<1],head[_<<4],cnt;

int stk1[__],top1,stk2[__],top2;

inline

void add(register

int a,register

int b)

inline zjy mx(register zjy a,register zjy b)

int dfs(register

int now1,register

int now2)

int main()

for(register

int i=1;i<=m;++i)

dp[1][1].zh=1;dp[1][1].pre1=0,dp[1][1].pre2=0;

register

int pf=0;

for(register

int i=head[n];i;i=nxt[i]));}}

if(dp[n][n].zh==0)

cout

<<"no solution!"

0; }

cout

int now1 = n,now2 = n;

while(1)

if(now4!=now2)

//cout}

for(register

int i=top1;i;i--){

cout

int i=2;i<=top2;++i){

cout

《網路流做法題解比較多,在這裡就不講了。

題解 航空路線問題

乙個點有兩種用法,但是只能選一種用,直接把乙個點拆掉並且連一條容量為1的邊就成功限制。將乙個點拆為兩個點,乙個入點乙個出點,入點到出點連一條費用為 inf 的邊,跑費用流,最終答案就是 dfrac 輸出方案隨便弄一下就好了。注意考慮邊界情況!1 n 不連通 費用流不能跑負環。spfa能跑什麼費用流就...

網路流24題 航空路線問題 題解

從西向東依次給出 n 座城市,和這 n 座城市中的 m 條邊,求出滿足下列條件的旅行路徑 從這道題的題面再結合範圍非常有限的 n 很容易想到可以用網路流來解決。那麼下面考慮如何建圖 首先由於每乙個點只能被經過一次,那我們可以用到乙個非常常見的手法,就是拆點,將 i 拆成 i 和 i n 兩個點,再在...

NKOI 1946 航空路線

線性規劃與網路流24題 11 航空路線 time limit 10000ms memory limit 65536k total submit 18 accepted 2 case time limit 1000ms description 給定一張航空圖,圖中頂點代表城市,邊代表2城市間的直通航線...