#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作為整個強聯通分量所有節點的時間。並...