#include<cstdio>
#include<algorithm>
#include<cstring>
#include<vector>
#include<stack>
#include<queue>
#define maxn 10005
using namespace std;
int n,m,w[maxn],dfn[maxn],low[maxn],tim,c[maxn],scc,W[maxn];
bool insta[maxn];
vector<int>g[maxn],e[maxn];
stack<int>sta;
void dfs(int now,int fa){
dfn[now]=low[now]=++tim;
sta.push(now);insta[now]=1;
for(int i=0,siz=g[now].size(),v;i<siz;i++)
if(!dfn[v=g[now][i]])
dfs(v,now),low[now]=min(low[v],low[now]);
else if(insta[g[now][i]])
low[now]=min(low[now],dfn[v]);
if(dfn[now]==low[now]){
int tmp=-1;scc++;
while(tmp!=now){
tmp=sta.top();
sta.pop();
W[scc]+=w[tmp];
c[tmp]=scc;
insta[tmp]=0;
}
}
}
void tarjan(){
memset(dfn,0,sizeof dfn);
memset(low,0,sizeof low);
tim=0,scc=0;
for(int i=1;i<=n;i++)
if(!dfn[i])
dfs(i,0);
}
void thinen(){
for(int i=1;i<=n;i++)
for(int j=0,siz=g[i].size();j<siz;j++)
if(c[i]!=c[g[i][j]])
e[c[i]].push_back(c[g[i][j]]);
}
int main(){
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++) scanf("%d",&w[i]);
int u,v;
for(int i=1;i<=m;i++)
{
scanf("%d%d",&u,&v);
g[u].push_back(v);
}
tarjan();
thinen();
}
“相关推荐”对你有帮助么?
-
非常没帮助
-
没帮助
-
一般
-
有帮助
-
非常有帮助
提交