hihocoder 1185 連通性 三

2021-07-09 13:12:17 字數 1872 閱讀 6556

時間限制:

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

1->3->5 total: 9

1->3->6->3->5: total: 13

所以最多能夠吃到的牧草數量為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行,...