poj2762 (Tarjan + dp找最长链)
来源:互联网 发布:仿真软件matlab 编辑:程序博客网 时间:2024/06/06 09:26
题意:
给定一副有向图,选择两个点v和u,要求v能到达u或者u能到达v。
问是否可以对于图中的每一个点对<v, u>都能满足条件?输出Yes或No。
思路:
强连通分量中的点可以看作一个点,所以先tarjan缩点。
然后当且仅当缩点图是一条链时才能满足任意一个点对都能从一点到达另一点。
因为如果缩点图有分叉,则分叉之间一定是不可达的。
所以只要dp求最长链,如果长度就是缩点后点的个数则输出Yes,否则输出No。
代码(1876K,391MS):
#include <cstdio>#include <cstring>#include <algorithm>#include <iostream>#include <vector>#include <stack>using namespace std;int T, n, m, t;vector<int> edges[1005];vector<int> tree[1005];int dp[1005];bool flag[1005][1005];stack<int> s;int dfn[1005];int low[1005];int vis[1005];int col[1005];int cnt, num;void dfs(int u) {s.push(u);vis[u] = 1;dfn[u] = low[u] = ++cnt;for (int i = 0; i < edges[u].size(); i++) {int v = edges[u][i];if (!dfn[v]) {dfs(v);low[u] = min(low[u], low[v]);} else if (vis[v])low[u] = min(low[u], dfn[v]);}if (low[u] == dfn[u]) {num++;do {t = s.top();s.pop();vis[t] = 0;col[t] = num;} while (t != u);}}void tarjan() {while (!s.empty()) s.pop();memset(dfn, 0, sizeof(dfn));memset(low, 0, sizeof(low));memset(vis, 0, sizeof(vis));memset(col, 0, sizeof(col));cnt = num = 0;for (int i = 1; i <= n; i++)if (!dfn[i]) dfs(i);}int DP(int x) {if (dp[x] != -1) return dp[x];int ans = 0;for (int i = 0; i < tree[x].size(); i++) {int nex = tree[x][i];ans = max(ans, DP(nex));}dp[x] = ++ans;return ans;}int main() {scanf("%d", &T);while (T--) {scanf("%d %d", &n, &m);for (int i = 0; i <= n; i++) {tree[i].clear();edges[i].clear();}int a, b;for (int i = 0; i < m; i++) {scanf("%d %d", &a, &b);edges[a].push_back(b);}tarjan();memset(flag, 0, sizeof(flag));for (int i = 1; i <= n; i++) {for (int j = 0; j < edges[i].size(); j++) {if (col[i] != col[edges[i][j]] && !flag[col[i]][col[edges[i][j]]]) {flag[col[i]][col[edges[i][j]]] = 1;tree[col[i]].push_back(col[edges[i][j]]);}}}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;}
0 0
- poj2762 (Tarjan + dp找最长链)
- codeforces 522A Reposts-找最长链长度dp[x]
- ZOJ 3795 Grouping (tarjan缩点求最长链)
- 2017多校九 05题 hdu 6165 FFF at Valentine 缩点 dp找最长链/拓扑排序
- 1924: [Sdoi2010]所驼门王的宝藏 tarjan缩点+dp最长路
- [洛谷 2403]所驼门王的宝藏---tarjan缩点+最长路(dp)
- poj2762强连通分量+判断单链
- 【POJ2762】Going from u to v or from v to u?(tarjan+缩点+拓扑排序)
- [练习][poj2762]tarjan缩点 Going from u to v or from v to u?
- POJ 3728 tarjan+DP
- UVA 539 The Settlers of Catan dfs找最长链
- POJ2762 Going from u to v or from v to u? 强连通 Tarjan缩点+拓扑排序topsort
- POJ2762-Going from u to v or from v to u?(Tarjan缩点,DAG判直链)
- LightOJ 1026 - Critical Links (tarjan 找桥)
- UVA 6907 Body Building Tarjan找桥
- 20160804 最长链 树分治?树DP?
- hdu4612Warm up tarjan+树形dp
- Luogu 1074(tarjan+dp)
- uvaoj 136 Ugly Numbers 优先队列使用
- 一种排序
- Adb-For-Test 使用 adb 命令实现元素定位等功能,用来辅助 android 测试
- linux在shell中获取时间
- 浅谈进程同步和互斥的概念
- poj2762 (Tarjan + dp找最长链)
- 四、title的用法
- ubuntu qt程序发布到其他机子运行
- 【Flume】【源码分析】从入口Application来分析Flume的启动过程
- hdu 4339 线段树+二分
- CustomListView 中不能在adapter中对item进行监听
- PB 实现dddw联动
- 芯客-Rayeager PX2支持NetBSD
- VxWorks设备驱动入门示例程序Hello Wold