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

2021-08-19 14:17:00 字數 1655 閱讀 5709

特判與本地能過但是交上去就不對…。

同樣是等會兒一塊寫吧。

題意有n個城市,一些城市之間兩兩存在邊。要求從城市1出發走到城市n然後再從城市n走到城市1。

要求經過的城市形成乙個單調遞增+單調遞減序列。

求這最長的序列並且輸出。

分析首先考慮轉化問題變成從1走到n兩次。

然後求最大費用最大流。通過判斷是否滿流來判斷是否存在解。

然後再通過正反各輸出一次來輸出方案。

大概就沒了。

非要有什麼注意的就是一開始怎麼會想把邊變成點呢 大概有點糊塗了orz

code

#include

using

namespace

std;

/* 某一條邊正著或者反著只能流一次。

給每一條邊再來乙個容量...?總之就是限制這條邊只能流一次[???]

把邊拆成點。然後瞎搞。[????]

還是有很多問題啊。

源點和匯點總不可能是同乙個吧。

然後就是怎麼瞎搞呢...???

等等好像是我搞錯了啊。

是點不能重複兩次經過所以是把點拆成邊啊。

哦 好像明朗了。

那麼就是最大費用流。

然後節點的事情就把所有跟1連的點多連乙個匯點。

帶環的話spfa好像跑不動啊...

那把環去掉行不行呢。

從x到y再回x相當於x到y走兩次

*/void read(int &x)

string sx,sy,name[105];

#define m 205

struct ede[m*m];

#define inf 100000

int nx[m],ecnt;

void add(int x,int y,int cap,int cost);

nx[x]=ecnt++;

e[ecnt]=(ed);

nx[y]=ecnt++;

}int n;

struct ek_ek}}

return dis[t]>-inf;

}int dfs(int x,int f)

int res=dfs(e[nxt[x]^1].x,min(f,e[nxt[x]].cap));

e[nxt[x]].cap-=res; e[nxt[x]^1].cap+=res;

return res;

}

void solve(int ss,int tt)

void find1(int x)

}void find2(int x)

cout

}ek;

map< string , int >mp;

int main()

add(n+n,t,2,0);

add(1,n+1,2,1);

add(n,n+n,2,1);

for (int i=2;i1,1);

}for (int i=1;i<=m;i++)

ek.solve(s,t);

if (ek.flow==2)printf("%d\n",ek.cost-2),ek.pt();

else

printf("no solution!\n");

return

0;}

網路流24題 航空路線問題

題目描述 給定一張航空圖,圖中頂點代表城市,邊代表 2 城市間的直通航線。現要求找出一條滿足下述限制條件的且途經城市最多的旅行路線。1 從最西端城市出發,單向從西向東途經若干城市到達最東端城市,然後再單向從東向西飛回起點 可途經若干城市 2 除起點城市外,任何城市只能訪問 1 次。從東到西到達乙個點...

網路流 24 題 航空路線問題

題目描述 給定一張航空圖,圖中頂點代表城市,邊代表兩個城市間的直通航線。現要求找出一條滿足下述限制條件的且途經城市最多的旅行路線。從最西端城市出發,單向從西向東途經若干城市到達最東端城市,然後再單向從東向西飛回起點 可途經若干城市 除起點城市外,任何城市只能訪問一次。對於給定的航空圖,試設計乙個演算...

網路流24題 航空路線問題

乙個點只能經過一次 拆點,連流量為1,費用為0的邊。最多能經過多少城市 最大費用流。兩個點之間有一條路線 從u 連向v。這種題一般都這樣建邊 需要注意的一點是 第二個測試點它的最佳方案是從1到n然後再到1 所以不能對於每條可行的線路的容量設定成1,這樣的話對於這種情況就無法回來了qwq ifndef...