一道既可以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城市間的直通航線...