·要求路程盡可能短,天數盡可能長,那麼肯定是最小費用最大流了。天數作為流量,路程作為費用。
按照要求,每個路口只能走一次,這個就是不重複選取的問題,在最大流中的最長不下降子串行問題有涉及到,解決的辦法就是將點拆開,設入點為i
ii,出點為i′i^
i′。然後在之間建一條流量為1
11的邊。
這裡也是相同的,只需要拆點後建一條流量為1
11,費用為0
00的邊即可。由於1
11和n
nn可以使用無限次,所以1
11和1′1^
1′,n
nn和n′n^
n′之間的流量設為inf
infin
f,然後從源點向1
11連一條流量為inf
infin
f,費用為0
00的邊;從n′n^
n′向匯點連一條流量為inf
infin
f,費用為0
00的邊。對於每個街道,從a′a^
a′向b
bb連一條流量為1
11,費用為c
cc的邊。
#include
#define pii pair
#define ll long long
#define cl(x,y) memset(x,y,sizeof(x))
#define loop(x,y,z) for(x=y;x<=z;x++)
#define reve(x,y,z) for(x=y;x>=z;x--)
#define ct cerr<<"time elapsed:"<<1.0*clock()/clocks_per_sec<<"s.\n";
#define mp make_pair
#define pb push_back
#define fi first
#define se second
#define all(x) x.begin(),x.end()
#define lson x<<1,l,mid
#define rson x<<1|1,mid+1,r
#define inf 1e18
const
int n=
1e4+10;
const
int m=
1e6+10;
const
int mod=
1e9+7;
const
int inf=
0x3f3f3f3f
;const
double eps=
1e-8
;const
double pi=
acos(-
1);using
namespace std;
struct edge
e[m]
;int head[n]
,len=
1,dis[n]
,vis[n]
;int maxflow,mincost;
int pre[n]
,path[n]
;void
add(
int u,
int v,
int f,
int w)
; head[u]
=len;
}void
inc(
int u,
int v,
int f,
int w)
intspfa
(int s,
int t)}}
}return pre[t]!=-
1;}voidek(
int s,
int t)
maxflow+
=mi;
mincost+
=dis[t]
*mi;}}
intmain()
ek(s,t)
; cout<" "
}
洛谷 P2153 SDOI2009 晨跑
給出一幅有向無環圖,問從點1到點n有幾條互相沒有交點 除起點終點外不能有公共點 的路徑,保證路徑數量最多的情況下,路徑最大數量與最短的路徑長度之和是多少.與費用流裸題不同的是,不能有公共點,解決方法是將每乙個點拆為乙個入點和乙個出點,流量為1 起點終點不用拆或者流量為inf 建邊時,從乙個點的出點連...
洛谷P2153 SDOI2009 晨跑
elaxia最近迷戀上了空手道,他為自己設定了一套健身計畫,比如俯臥撐 仰臥起坐等 等,不過到目前為止,他堅持下來的只有晨跑。現在給出一張學校附近的地圖,這張地圖中包含n個十字路口和m條街道,elaxia只能從 乙個十字路口跑向另外乙個十字路口,街道之間只在十字路口處相交。elaxia每天從寢室出發...
洛谷P4043 費用流
這題的建圖方式可以模擬洛谷p1251 我是由那個題才想到這麼建的,由於每條邊至少經過一次,我們又不清楚需要跑多少次,把邊看成點,點與匯點相連,可是我們又不知道最大流應該是多少,直接這麼連會發生錯誤。利用那道題的思想,每條邊最少需要一次,那麼就每條邊看做兩個點,點1和點2,點1有1的流量流向匯點,點2...