poj2762 Tarjan dp找最長鏈

2021-06-28 08:09:42 字數 1245 閱讀 9684

給定一副有向圖,選擇兩個點v和u,要求v能到達u或者u能到達v。

問是否可以對於圖中的每乙個點對都能滿足條件?輸出yes或no。

強連通分量中的點可以看作乙個點,所以先tarjan縮點。

然後當且僅當縮點圖是一條鏈時才能滿足任意乙個點對都能從一點到達另一點。

因為如果縮點圖有分叉,則分叉之間一定是不可達的。

所以只要dp求最長鏈,如果長度就是縮點後點的個數則輸出yes,否則輸出no。

#include #include #include #include #include #include using namespace std;

int t, n, m, t;

vectoredges[1005];

vectortree[1005];

int dp[1005];

bool flag[1005][1005];

stacks;

int dfn[1005];

int low[1005];

int vis[1005];

int col[1005];

int cnt, num;

void dfs(int u) else if (vis[v])

low[u] = min(low[u], dfn[v]);

} if (low[u] == dfn[u]) while (t != u); }}

void tarjan()

int dp(int x)

dp[x] = ++ans;

return ans;

}int main()

int a, b;

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

tarjan();

memset(flag, 0, sizeof(flag));

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

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

memset(dp, -1, sizeof(dp));

int ans = 0;

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

ans = max(ans, dp(i));

if (ans == num) printf("yes\n");

else printf("no\n");

} return 0;

}

POJ 2762 強連通分量

剛剛在算導上學會用兩次dfs求scc,終於過了前段時間群賽的乙個題。題意 給定乙個有向圖,讓你求它是否為半連通圖 即對於圖中任意兩個頂點u,v 是否有u可以到達v或者v可以到達u 解題思路 當時還不知道啥強連通分量,看了人家的一篇部落格,了解了下解題思路,就是先求強連通分量 縮點,得到縮點以後的da...

poj 2762 強連通 判斷鏈

思路 首先當然是要縮點建新圖,由於題目要求是從u v或從v u連通,顯然是要求單連通了,也就是要求一條長鏈了,最後只需判斷鏈長是否等於新圖頂點個數即可,至於如何求一條鏈長,直接dfs即可,注意點就是dfs是要從入度為0的頂點開始。1 include2 include3 include4 includ...

POJ 2762 強連通分量

剛剛在算導上學會用兩次dfs求scc,終於過了前段時間群賽的乙個題。題意 給定乙個有向圖,讓你求它是否為半連通圖 即對於圖中任意兩個頂點u,v 是否有u可以到達v或者v可以到達u 解題思路 當時還不知道啥強連通分量,看了人家的一篇部落格,了解了下解題思路,就是先求強連通分量 縮點,得到縮點以後的da...