強聯通分量

2021-07-06 04:50:24 字數 1894 閱讀 5873

#include

#include

#include

#include

#include

#include

#include

#include

using namespace std;

struct edge

;vectora[80005],b[80005],node[80005];

int he[80005];

int n,m,t=0;

int vis[80005];

int vis2[80005];

mapflag[80005];

vectorp;

void dfs1(int x)

}

void dfs3(int x,int t)

}

void spfa(int s)

;

bool gone[80005]=;

queueq;

q.push(s);

gone[s]=1;

dis[s]=he[s];

while(!q.empty())

}}

}

int cmax=0;

for(int i=1;i<=t;i++)

cmax=max(cmax,-dis[i]);

cout<>n>>m;

for(int i=1;i<=m;i++)

a[x].push_back((edge));

b[y].push_back((edge));

}

for(int i=1;i<=n;i++)

if(vis[i]==0)

dfs1(i);

memset(vis,0,sizeof(vis));

for(int i=n-1;i>=0;i--)

}

for(int i=n-1;i>=0;i--)

}

for(int i=1;i<=n;i++)

);

// flag[vis[i]][vis[a[i][j].to]]=1;

}}

}

int x; cin>>x;

spfa(vis[x]);

return 0;

}小胖和zyr要去esqms森林採蘑菇。

esqms森林間有n個小樹叢,m條小徑,每條小徑都是單向的,連線兩個小樹叢,上面都有一定數量的蘑菇。小胖和zyr經過某條小徑一次,可以採走這條路上所有的蘑菇。由於esqms森林是一片神奇的沃土,所以一條路上的蘑菇被採過後,又會長出一些新的蘑菇,數量為原來蘑菇的數量乘上這條路的「恢復係數」,再下取整。

比如,一條路上有4個蘑菇,這條路的「恢復係數」為0.7,則第一~四次經過這條路徑所能採到的蘑菇數量分別為4,2,1,0.

現在,小胖和zyr從s號小樹叢出發,求他們最多能採到多少蘑菇。

對於30%的資料,n<=7,m<=15

另有30%的資料,滿足所有「恢復係數」為0

對於100%的資料,n<=80,000,m<=200,000,0.1<=恢復係數<=0.8且僅有一位小數,1<=s<=n.

輸入輸出格式 input/output

輸入格式:

第一行,n和m

第2……m+1行,每行4個數字,分別表示一條小路的起點,終點,初始蘑菇數,恢復係數。

第m+2行,乙個數字s

輸出格式:

乙個數字,表示最多能採到多少蘑菇,在int32範圍內。

強聯通分量做每塊值。。再把每塊連起來spfa(注意既有邊權又要點權計算方法不一樣)但是ztr說直接拓撲圖動歸就行了。。。另外注意精度問題。。。本題要用double

**:

強聯通分量

有向圖中 u可達 v不一定意味著v可達 u.相互可達則屬於同乙個強連通分量 strongly connected component,scc 最關鍵通用部分 強連通分量一定是圖的深搜樹的乙個子樹。1.演算法思路 基本思路 這個演算法可以說是最容易理解,最通用的演算法,其比較關鍵的部分是同時應用了原圖...

強聯通分量

2020 10 31 內容來自oi wiki和yu xuan 的講課 強聯通分量 個人理解 tarjan 演算法是由棧來實現的 dfn u dfs序 low u 以u為根的子樹,最小的dfs序那麼會出現 3 中情況 void tarjan int u else if vis v 1 low u mi...

強聯通分量 tarjan

tarjan演算法思想 dfs節點的時候,用time記錄訪問順序,則父節點會先於子節點訪問。那麼節點u遞迴的過程中找到了父節點 先訪問的 形成乙個環路,這個環路上的所有節點就是乙個強聯通分量。low的作用是用強聯通分量上的最先訪問的節點 訪問到的父節點 得time作為整個強聯通分量所有節點的時間。並...