原題鏈結
題意是有一堆人,和若干關係(單向),你假如選擇了乙個人,那麼其他可以傳遞的都不需要花費就可以得到。。問最小花費和最少選擇人數。。
是乙個求強連通的題目,因為如果我們把強連通分量縮點了以後,那麼其實就是要把入度為0的都選了就可以,注意如果入度為0的是乙個縮點就再列舉找一下裡面最小的。。
接下來就是很顯然了,這裡套用kuangbin的模板。。第一次做強連通,沒有想到縮點,用了個奇怪的姿勢水過。。。後來想了想應該是錯誤的?大概是資料比較弱。
ac**(可能有錯誤,主要練習一下 tarjan。。。
#include #include #include #include #include using namespace std;
int n,m,a,b;
const int maxn = 1005;
const int maxm = 2005;
vectore[maxn];
struct edge edge[maxm];
int head[maxn],tot;
int low[maxn],dfn[maxn],stack[maxn],belong[maxn];
int index,top,scc;
bool instack[maxn];
int num[maxn];
void addedge(int u,int v)
void tarjan(int u)
else if(instack[v] && low[u] > dfn[v]) low[u] = dfn[v];
}if(low[u] == dfn[u])
while( v != u);
}}void solve(int n)
void init()
int arr[maxn];
int vis[maxn];
vectorbe[maxn];
pairin[maxn];
void dfs(int x){
vis[x]=1;
for(int i=0;i
強連通分量 tarjan求強連通分量
雙dfs方法就是正dfs掃一遍,然後將邊反向dfs掃一遍。挑戰程式設計 上有說明。雙dfs 1 include 2 include 3 include 4 include 5 6using namespace std 7const int maxn 1e4 5 8 vector g maxn 圖的鄰...
強連通分量
對於有向圖的乙個頂點集,如果從這個頂點集的任何一點出發都可以到達該頂點集的其餘各個頂點,那麼該頂點集稱為該有向圖的乙個強連通分量。有向連通圖的全部頂點組成乙個強連通分量。我們可以利用tarjan演算法求強連通分量。define n 1000 struct edge e 100000 int ec,p...
強連通分量
在有向圖g中,如果兩個頂點間至少存在一條路徑,稱兩個頂點強連通 strongly connected 如果有向圖g的每兩個頂點都強連通,稱g是乙個強連通圖。非強連通圖有向圖的極大強連通子圖,稱為強連通分量 strongly connected components 下圖中,子圖為乙個強連通分量,因為...