【問題描述】
隨著牛的數量增加,農場的道路的擁擠現象十分嚴重,特別是在每天晚上的擠奶時間。為了解決這個問題,fj決定研究這個問題,以能找到導致擁堵現象的瓶頸所在。
牧場共有m條單向道路,每條道路連線著兩個不同的交叉路口,為了方便研究,fj將這些交叉路口編號為1..n,而牛圈位於交叉路口n。任意一條單向道路的方向一定是是從編號低的路口到編號高的路口,因此農場中不會有環型路徑。同時,可能存在某兩個交叉路口不止一條單向道路徑連線的情況。
在擠奶時間到來的時候,奶牛們開始從各自的放牧地點回到牛圈。放牧地點是指那些沒有道路連線進來的路口(入度為0的頂點)。
現在請你幫助fj通過計算從放牧點到達牛圈的路徑數目來找到最繁忙的道路(答案保證是不超過32位整數)。
【輸入格式】
第一行:兩個用空格隔開的整數n和m。
接下來m行:每行兩個用空格隔開的整數a,b,表示一條道路從a到b。
【輸出格式】
乙個整數,表示所有路徑中通過某條道路的最大次數。
【輸入樣例】
7 71 3
3 43 5
4 62 3
5 66 7
【輸出樣例】
4【樣例解釋】
奶牛通向宿舍的所有路徑:(1->3->4->6->7)、(1->3->5->6->7)、(2->3->4->6->7)、(2->3->5->6->7)。其中 6->7 同過的次數為 4,是最大的。
【資料範圍】
1 <= m <= 50,000 1 <= n <= 5,000
【**】
poj3272
解題思路:根據題意,農場中的單向道路一定是由編號低的路口到編號高的路口,所以將路口看作點,道路看作邊,所得的圖是dag圖。要求最繁忙的道路可以依次判斷每條道路所經過的奶牛次數,而要判斷一條道路所經過的奶牛次數,可以先算出道路連線的兩點,從放牧地點到起始點經過的奶牛次數和從道路末點到牛圈經過的奶牛次數,相乘即為該道路經過的奶牛次數。所以,該題的主要演算法為dag圖上的動態規劃(記憶化搜尋)。需要注意的是,要求乙個點到牛圈經過的奶牛次數,需在輸入時建立反向圖進行動態規劃。
#include#include#include#include#include#include#includeusing namespace std;
const int maxn=5005;
int n,m,a,b;
vectorg[maxn],gr[maxn];
int rd[maxn];
long long d1[maxn],d2[maxn],ans=0;
long long f1(int i) //求乙個點到牛圈經過的奶牛次數
if(d1[i]) return d1[i]; //記憶化搜尋,節省時間
for(int k=0;k
poj 3272 二分答案 最大值最小化
原題 給n個數 讓分成m個區域 讓最大值最小 可以通過二分答案來做 二分的範圍就是這n個數的最大值到他們的總和了 那麼我們防止邊界的問題 所以鬆弛一下 左右邊界各擴乙個點 然後每個mid就是要求的值 去跑個judge函式 看可劃分的區域個數 可劃分的區域個數如果 m 那麼就把上界下壓 如果 m 說明...
POJ 2074 直線交線段)
原題 line of sight 題意 站在一條線段property line上,去看另一條線段home,有一些障礙物擋著視線,求pl最長連續區間可以看另一條線段home的全貌。圖示 思路 1.去除不符合條件的障礙物 2.把每條線段擋住的區間求出來,然後遍歷一遍求最大區間即可。include inc...
POJ3040給奶牛發工資
題意 有n種硬幣,每種硬幣有mi個,然後讓你給奶牛發工資,每週發至少c元 就是不找零錢的意思 然後問你能發幾周?硬幣之間都是倍數關係 思路 這個題目做了兩天,丟臉,看完這個題目我的第一反應就是從大的發起,就是先花面值大的,能大的就一直大的,只要不超過c,然後再能小的就一直小的,補全沒超過但是又不夠那...