#include<iostream>
#include<vector>
#include<algorithm>
#include<string.h>
#define MAX_N 100
using namespace std;
int n,m;
struct edge
{
int from,next;
};
vector<edge> a;
vector<edge> newa;
int dfn[MAX_N];
int low[MAX_N];
int vis[MAX_N];
int belong[MAX_N];
int stap[MAX_N];
int value[MAX_N];
int newvalue[MAX_N];
int dp[MAX_N]={0};
int stop=0,bcnt=0,dindex=0;
vector<int> b[MAX_N];
vector<int>newb[MAX_N];
void tarjan(int i)
{ dfn[i]=low[i]=++dindex;
vis[i]=1;
stap[++stop]=i;
for(int j=0;j<b[i].size();j++)
{
if(dfn[b[i][j]]==0)
{
tarjan(b[i][j]);
low[i]=min(low[i],low[b[i][j]]);
}
else if(vis[b[i][j]]&&dfn[b[i][j]]<low[i])
{
low[i]=dfn[b[i][j]];
}
}
int j;
if(dfn[i]==low[i])
{
bcnt++;
do{
j=stap[stop--];
vis[j]=0;
belong[j]=bcnt;
}
while(i!=j);
}
}
void dfs(int i)
{
if(vis[i])return;
for(int j=0;j<newb[i].size();j++)
{
if(!vis[newb[i][j]])
{
dfs(newb[i][j]);
vis[newb[i][j]] =1;
}
dp[i]=max(dp[i],dp[newb[i][j]]+newvalue[i]);
}
}
int main()
{
cin>>n>>m;
for(int i=1;i<=n;i++)
{
cin>>value[i];
}
for(int i=1;i<=m;i++)
{
int c,b;
cin>>c>>b;
a.push_back((edge){c,b});
}
for(int i=0;i<m;i++)
{
b[a[i].from].push_back(a[i].next);
}
for(int i=1;i<=n;i++)
{
if(!dfn[i])
{ stop=dindex=0;
tarjan(i);
}
}
int newedge=0;
for(int i=0;i<m;i++)
{ if(belong[a[i].from]!=belong[a[i].next])
{newedge++;
newa.push_back((edge){belong[a[i].from],belong[a[i].next]});}
}
for(int i=0;i<newedge;i++)
{
newb[newa[i].from].push_back(newa[i].next);
}
for(int i=1;i<=n;i++)
{
newvalue[belong[i]]+=value[i];
}
for(int i=1;i<=bcnt;i++)
{
dp[i] = newvalue[i];
}
memset(vis,0,sizeof(vis));
for(int i=1;i<=bcnt;i++)
{
if(!vis[i])
dfs(i);
}
int ans=0;
for(int i=1;i<=bcnt;i++)
{
ans = max(ans,dp[i]);
}
cout<<ans;
system("pause");
}
第一组样例.in
10 20
970 369 910 889 470 106 658 659 916 964
3 2
3 6
3 4
9 5
8 3
5 8
9 1
9 7
9 8
7 5
3 7
7 8
1 7
10 2
1 10
4 8
2 6
3 1
3 5
8 5
.out
6911