特判與本地能過但是交上去就不對…。
同樣是等會兒一塊寫吧。
題意有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...