强连通分量问题
2015-08-24 20:58
211 查看
连通性·三
题目传送:hihoCoder - 1185 - 连通性·三AC代码:
[code]#include <map> #include <set> #include <list> #include <cmath> #include <deque> #include <queue> #include <stack> #include <bitset> #include <cctype> #include <cstdio> #include <string> #include <vector> #include <complex> #include <cstdlib> #include <cstring> #include <fstream> #include <sstream> #include <utility> #include <iostream> #include <algorithm> #include <functional> #define LL long long #define INF 0x7fffffff using namespace std; const int maxn = 20005; int n, m; int dfn[maxn]; int low[maxn]; int in_stack[maxn]; int col[maxn]; int vis[maxn]; int w[maxn]; int W[maxn]; int indeg[maxn]; pair<int, int> e[100005]; vector<int> G[maxn]; vector<int> G2[maxn]; stack<int> s; int cur_time, color; void tarjan(int u) { dfn[u] = low[u] = ++ cur_time; s.push(u); in_stack[u] = 1; vis[u] = 1; int d = G[u].size(); for(int i = 0; i < d; i ++) { int v = G[u][i]; if(!vis[v]) { tarjan(v); low[u] = min(low[u], low[v]); } else if(in_stack[v]) { low[u] = min(low[u], dfn[v]); } } color ++; if(dfn[u] == low[u]) { int v; do { v = s.top(); s.pop(); in_stack[v] = 0; col[v] = color; W[color] += w[v]; } while(v != u); } } void make_new_graph() { for(int i = 0; i < m; i ++) { int u = col[e[i].first]; int v = col[e[i].second]; if(u == 0 || v == 0) continue; //cout << u << " " << v << endl; if(u != v) { G2[u].push_back(v); indeg[v] ++; } } } int ans; int MAX[maxn]; void toposort() { queue<int> que; for(int i = 1; i <= color; i ++) { if(indeg[i] == 0) { que.push(i); MAX[i] = W[i]; //cout << i << " " << W[i] << endl; ans = max(MAX[i], ans); } } while(!que.empty()) { int u = que.front(); que.pop(); int d = G2[u].size(); for(int i = 0; i < d; i ++) { int v = G2[u][i]; indeg[v] --; MAX[v] = max(MAX[v], MAX[u] + W[v]); if(indeg[v] == 0) { que.push(v); ans = max(MAX[v], ans); //cout << v << " " << MAX[v] << endl; } } } } int main() { scanf("%d %d", &n, &m); for(int i = 1; i <= n; i ++) { scanf("%d", &w[i]); } for(int i = 0; i < m; i ++) { scanf("%d %d", &e[i].first, &e[i].second); G[e[i].first].push_back(e[i].second); } while(!s.empty()) s.pop(); memset(col, 0, sizeof(col)); memset(in_stack, 0, sizeof(in_stack)); cur_time = color = 0; tarjan(1); make_new_graph(); ans = 0; toposort(); printf("%d\n", ans); return 0; }
相关文章推荐
- FZU 1686 神龙的难题 (DLX重复覆盖)
- 欢迎使用CSDN-markdown编辑器
- java中的异常机制(编译时异常)
- 在AndroidStudio不能找到so文件问题:couldn't find libweibosdkcore.so
- 【cocos2d-x 3.7 飞机大战】 决战南海I (七) 控制器的实现
- Native和H5两种情况的头像上传
- 别等待-想到什么就去做
- 关于Qt几个问题的答案
- Linux系统启动流程
- Android控件之ImageView
- UIScorllView和UIPageController的区别和实现图片轮播
- 套接字编程简介
- xml格式保存信息到文件
- 【cocos2d-x 3.7 飞机大战】 决战南海I (六) 保存玩家数据
- 关于矩阵的一些问题
- sping boot demo解释
- Chapter 2: Design the user experience
- jquery ajax load
- JMS - 消息确认
- TextView属性