# 題目
AP325 Q-7-7. AOV 最早完工時間
# 解題思路
O(n+m)
# 程式碼
#include<bits/stdc++.h> | |
using namespace std; | |
#define N 10005 | |
int n,m,dis,w[N];//in-degree 入度 | |
bool done[N],indeg[N]; | |
vector<int> adj[N],ans; | |
set<int> st; | |
void f(int p){ | |
if(indeg[p]==0) return; | |
int mx=0; | |
for(auto e:adj[p]){ | |
f(e); | |
if(w[mx]<w[e]) | |
mx=e; | |
} | |
indeg[p]=0; | |
w[p]=w[p]+w[mx]; | |
if(w[ans.front()]<w[p]){// 如果多個點花的時間一樣都要判斷關鍵工作 | |
ans.clear(); | |
ans.push_back(p); | |
}else if(w[ans.front()]==w[p]) | |
ans.push_back(p); | |
} | |
void dfs(int p){// 如果多個點花的時間一樣都要判斷關鍵工作 | |
vector<int> mx; | |
mx.push_back(0); | |
st.insert(p); | |
for(auto e:adj[p]){ | |
if(w[mx.front()]<w[e]){ | |
mx.clear(); | |
mx.push_back(e); | |
}else if(w[mx.front()]==w[e]) | |
mx.push_back(e); | |
} | |
if(mx.front()!=0){ | |
for(auto e:mx) | |
dfs(e); | |
} | |
} | |
int main(){ | |
ios::sync_with_stdio(0); | |
cin.tie(0); | |
cin>>n>>m; | |
for(int i=1;i<=n;i++) | |
cin>>w[i]; | |
for(int i=0,u,v;i<m;i++){ | |
cin>>u>>v; | |
adj[v].push_back(u); | |
indeg[v]=1; | |
} | |
ans.push_back(0); | |
for(int i=1;i<=n;i++){ | |
if(indeg[i]==0) continue; | |
f(i); | |
} | |
for(auto e:ans)// 如果多個點花的時間一樣都要判斷關鍵工作 | |
dfs(e); | |
cout<<w[ans.front()]<<"\n"; | |
for(auto e:st) | |
cout<<e<<" "; | |
} |