網路流24題 航空路線問題 費用流

2022-03-25 21:28:17 字數 1709 閱讀 3008

洛谷傳送門

loj傳送門

這道題的圖還挺好想的吧

反正都是無向邊,起點走到終點再回到起點,就相當於從起點走$2$次到達終點,且這兩次不經過相同的點,還要經過盡可能多的點

很經典的費用流建圖

限制點通過次數->拆點連邊,流量為$1$,費用為$1$

圖中的其他邊,編號較小的指向編號較大的,流量為$inf$,費用為$0$

跑最大費用最大流即可

注意有$1$直接到$n$的情況,所以其他邊流量要設定到至少大於$2$

至於輸出方案呢,在殘量網路中,每次都$dfs$找出一條從匯點到源點的路徑即可

1 #include 2 #include 

3 #include 4 #include 5 #include 6 #include 7

#define n1 210

8#define m1 40010

9#define ll long long

10#define dd double

11#define inf 0x3f3f3f3f

12using

namespace

std;

1314

intgint()

1518

while(c>='

0'&&c<='9')

19return ret*fh;20}

21struct

edge

28}e,e;

29int

n,m,nn,s,t;

30 mapmp;

31int

que[m1],hd,tl,cost[n1],flow[n1],id[n1],use[n1];

32int

spfa()

3350

}51 use[x]=0;52

}53return cost[t]!=-inf;54}

55int

stk[n1],tp;

56void dfs(int

x)57

68 }else71}

72}73}

74char str[n1][20

];75

void

ek()

7686}87

if(mxflow<2)

88 printf("

%d\n

",tcost-2

);89

dfs(nn);

90while

(tp)

9196

dfs(nn);

97for(i=2;i<=tp;i++)

98103

}104

intmain()

105115 e.ae(1,1+n,2,1); e.ae(1+n,1,0,-1

); 116 e.ae(n,n+n,2,1); e.ae(n+n,n,0,-1

);117

for(i=2;i1,1), e.ae(i+n,i,0,-1

);118

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

119124 e.ae(s,1,2,0); e.ae(1,s,0,0

);125 e.ae(nn,t,2,0); e.ae(t,nn,0,0

);126

ek();

127return0;

128 }

網路流24題 航空路線問題

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

網路流 24 題 航空路線問題

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

網路流24題 航空路線問題

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