38 条题解
-
0
#include<bits/stdc++.h> using namespace std; const int N=1e5+5; int n , m , a[N]; int u , v; vector<int> vc[N]; int dfn[N] , low[N] , cnt; bool vis[N]; stack<int> st; int belong_cnt; //强连通分量个数 vector<int> belong[N];//强连通分量 int color[N];//color[i]表示第i头牛所处的强连通分量 vector<int> newvc[N]; int in[N];//入度 int ans[N]; void tarjan(int u) { dfn[u] = low[u] = ++cnt; vis[u] = 1; st.push(u); for(int i = 0; i < vc[u].size(); i++) { int v = vc[u][i]; if(!dfn[v]) { tarjan(v); low[u] = min(low[u] , low[v]); } else if(vis[v]) { low[u] = min(low[u] , low[v]); } } //强连通分量到头 if(dfn[u] == low[u]) { while(!st.empty()) { v = st.top(); st.pop(); vis[v] = 0; color[v] = u;//当前牛所处的强连通分量 if(u == v) break; a[u] += a[v]; } } } void tupo() { queue<int> q; for(int i = 1; i <= n; i++) { if(color[i] == i && !in[i]) { q.push(i); ans[i] = a[i]; } } while(!q.empty()) { int top = q.front(); q.pop(); for(int i = 0; i < newvc[top].size(); i++) { v = newvc[top][i]; ans[v] = max(ans[v] , ans[top] + a[v]); in[v]--; if(!in[v]) q.push(v); } } int maxx = 0; for(int i = 1; i <= n; i++) maxx = max(maxx , ans[i]); cout << maxx; } int main(){ cin >> n >> m; for(int i = 1; i <= n; i++) cin >> a[i]; while( m-- ) { cin >> u >> v; vc[u].push_back(v); } for(int i = 1; i <= n; i++) if(!dfn[i]) tarjan(i); //重新建边 for(int i = 1; i <= n; i++) { for(int j = 0; j < vc[i].size(); j++) { v = vc[i][j]; if(color[i] != color[v]) { newvc[color[i]].push_back(color[v]); in[color[v]]++; } } } tupo(); return 0;
信息
- ID
- 1
- 时间
- 1000ms
- 内存
- 128MiB
- 难度
- 1
- 标签
- 递交数
- 4986
- 已通过
- 1406
- 上传者