elaxia最近迷戀上了空手道,他為自己設定了一套健身計畫,比如俯臥撐、仰臥起坐等 等,不過到目前為止,他堅持下來的只有晨跑。 現在給出一張學校附近的地圖,這張地圖中包含n個十字路口和m條街道,elaxia只能從 乙個十字路口跑向另外乙個十字路口,街道之間只在十字路口處相交。elaxia每天從寢室出發 跑到學校,保證寢室編號為1,學校編號為n。 elaxia的晨跑計畫是按週期(包含若干天)進行的,由於他不喜歡走重複的路線,所以 在乙個週期內,每天的晨跑路線都不會相交(在十字路口處),寢室和學校不算十字路 口。elaxia耐力不太好,他希望在乙個週期內跑的路程盡量短,但是又希望訓練週期包含的天 數盡量長。 除了練空手道,elaxia其他時間都花在了學習和找mm上面,所有他想請你幫忙為他設計 一套滿足他要求的晨跑計畫。
存在1\rightarrow n1→
n 的邊存在。這種情況下,這條邊只能走一次。
輸入格式:
第一行:兩個數n,m。表示十字路口數和街道數。 接下來m行,每行3個數a,b,c,表示路口a和路口b之間有條長度為c的街道(單向)。
輸出格式:
兩個數,第乙個數為最長週期的天數,第二個數為滿足最長天數的條件下最短的路程長 度。
輸入樣例#1:
7 101 2 1
1 3 1
2 4 1
3 4 1
4 5 1
4 6 1
2 5 5
3 6 6
5 7 1
6 7 1
輸出樣例#1:
2 11
對於30%的資料,n ≤ 20,m ≤ 120。
對於100%的資料,n ≤ 200,m ≤ 20000。
最小費用最大流板子。。。
每個點只能走一次,可以想到拆點:
對於除了 1 和 n 的點,拆點的連邊流量為1,費用為0 。
其他的邊的流量定為1,費用為路徑長度。
跑出最大流即為最大天數,最小費用和為最短路徑。
特判起點為 1 的與 終點為 n 的有向邊,最大流即為 1 。
附**:
#include#include#include#include#define maxn 410
#define max 999999999
using namespace std;
int n,m,s,t,c=2,maxflow=0,mincost=0;
int head[maxn],path[maxn],deep[maxn],fa[maxn],flow[maxn];
bool vis[maxn];
struct nodea[maxn*maxn];
inline int read()
while(c>='0'&&c<='9')
return date*w;
}inline int relax(int u,int v,int i,int w,int cost)
return 0;
}inline void add(int u,int v,int w,int cost)
bool spfa()
path[s]=0;
vis[s]=true;
fa[s]=0;
flow[s]=max;
q.push(s);
while(!q.empty())
} }if(path[t]==max)return false;
return true;
}void ek()
maxflow+=flow[t];
mincost+=flow[t]*path[t]; }}
int main()
ek();
printf("%d %d\n",maxflow,mincost);
return 0;
}
洛谷 P2153 SDOI2009 晨跑
給出一幅有向無環圖,問從點1到點n有幾條互相沒有交點 除起點終點外不能有公共點 的路徑,保證路徑數量最多的情況下,路徑最大數量與最短的路徑長度之和是多少.與費用流裸題不同的是,不能有公共點,解決方法是將每乙個點拆為乙個入點和乙個出點,流量為1 起點終點不用拆或者流量為inf 建邊時,從乙個點的出點連...
(費用流)洛谷P2153 SDOI2009 晨跑
要求路程盡可能短,天數盡可能長,那麼肯定是最小費用最大流了。天數作為流量,路程作為費用。按照要求,每個路口只能走一次,這個就是不重複選取的問題,在最大流中的最長不下降子串行問題有涉及到,解決的辦法就是將點拆開,設入點為i ii,出點為i i i 然後在之間建一條流量為1 11的邊。這裡也是相同的,只...
洛谷P1972 SDOI2009 HH的項鍊
這道題想了很久,發題解是為了理解的更深刻一點。管理放我過好嘛qwq 步入正題 這道題應該是很多做法,我選擇的是離線 樹狀陣列。首先輸入陣列。用fisrt陣列先記錄元素最開始出現的位置,對應的每乙個樹狀陣列的位置add一下 樹狀陣列洛谷也有模板題的了解一下就ok啦 rep i,1 n 然後倒著更新一遍...