洛谷傳送門
loj傳送門
這道題的圖還挺好想的吧
反正都是無向邊,起點走到終點再回到起點,就相當於從起點走$2$次到達終點,且這兩次不經過相同的點,還要經過盡可能多的點
很經典的費用流建圖
限制點通過次數->拆點連邊,流量為$1$,費用為$1$
圖中的其他邊,編號較小的指向編號較大的,流量為$inf$,費用為$0$
跑最大費用最大流即可
注意有$1$直接到$n$的情況,所以其他邊流量要設定到至少大於$2$
至於輸出方案呢,在殘量網路中,每次都$dfs$找出一條從匯點到源點的路徑即可
1 #include 2 #include3 #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...