時間限制:
10000ms
單點時限:
1000ms
記憶體限制:
256mb
描述暑假到了!!小hi和小ho為了體驗生活,來到了住在大草原的約翰家。今天一大早,約翰因為有事要出去,就拜託小hi和小ho忙幫放牧。
約翰家一共有n個草場,每個草場有容量為w[i]的牧草,n個草場之間有m條單向的路徑。
小hi和小ho需要將牛羊群趕到草場上,當他們吃完乙個草場牧草後,繼續前往其他草場。當沒有可以到達的草場或是能夠到達的草場都已經被吃光了之後,小hi和小ho就把牛羊群趕回家。
一開始小hi和小ho在1號草場,在回家之前,牛羊群最多能吃掉多少牧草?
舉個例子:
圖中每個點表示乙個草場,上部分數字表示編號,下部分表示草場的牧草數量w。
在1吃完草之後,小hi和小ho可以選擇把牛羊群趕到2或者3,假設小hi和小ho把牛羊群趕到2:
吃完草場2之後,只能到草場4,當4吃完後沒有可以到達的草場,所以小hi和小ho就把牛羊群趕回家。
若選擇從1到3,則可以到達5,6:
選擇5的話,吃完之後只能直接回家。若選擇6,還可以再通過6回到3,再到5。
所以該圖可以選擇的路線有3條:
1->2->4 total: 11所以最多能夠吃到的牧草數量為13。1->3->5 total: 9
1->3->6->3->5: total: 13
本題改編自usaco月賽金組
輸入第1行:2個正整數,n,m。表示點的數量n,邊的數量m。1≤n≤20,000, 1≤m≤100,000
第2行:n個正整數,第i個整數表示第i個牧場的草量w[i]。1≤w[i]≤100,000
第3..m+2行:2個正整數,u,v。表示存在一條從u到v的單向路徑。1≤u,v≤n
輸出第1行:1個整數,最多能夠吃到的牧草數量。
樣例輸入
6 6樣例輸出2 4 3 5 4 4
1 22 4
1 33 5
3 66 3
13思路:先用tarjan演算法縮點,然後再重新建圖,最後從1號所屬的連通分量深搜,求出最大值。
提示中用拓撲排序可以求最值,可我一直wrong answer。。。(無語..)
#include #includeusing namespace std;
#include#include#define maxn 20010
int low[maxn],dfn[maxn],a[100010],b[100010];
int vis[maxn],belong[maxn],n,m,instack[maxn];
int cnt,scnt,top,stackn[maxn];
long long w1[maxn],w2[maxn],ans;
vectormat1[maxn];
vectormat2[maxn];
void tarjan(int s)
memset(low,0,sizeof(low));
memset(dfn,0,sizeof(dfn));
scnt=cnt=top=0;
for(i=1;i<=n;i++)
if(!dfn[i])
tarjan(i);
memset(w2,0,sizeof(w2));
for(i=1;i<=n;i++)
w2[belong[i]]+=w1[i];
for(i=0;i
8連通 4連通的洪氾填充以及邊界填
運用八連通邊界填充演算法 進行多邊形的填充 1 首先通過顏色混合的方式形成乙個圖形包中函式的對多邊形的填充,如下圖所示 注 主要 如下 實現多邊形的簡單填充 include include void init void void linesegment void int main int argc,...
八連通填充演算法
最近做了個圈地的遊戲,根據玩家行走路徑和自己的領地區域圈出自己的新領地。自己在演算法這方面比較薄弱,這次也趁機修煉了一波,寫下自己的心得和感悟在這裡。可能寫的不好,希望看到的僅供參考,不足之處和錯誤之處多謝指正。八連通演算法其實就是給定乙個種子點,通過迴圈查詢以自己為中心的3 3其他八個點,滿足要求...
837 連通塊中點的數量
給定乙個包含n個點 編號為1 n 的無向圖,初始時圖中沒有邊。現在要進行m個操作,操作共有三種 c a b 在點a和點b之間連一條邊,a和b可能相等 q1 a b 詢問點a和點b是否在同乙個連通塊中,a和b可能相等 q2 a 詢問點a所在連通塊中點的數量 輸入格式 第一行輸入整數n和m。接下來m行,...