题目意思是求最短路,但是因为此图没有环,所以可以用动态规划的办法按照拓扑序列递推求解
第一次调用系统的链表
自己写的链表居然T了...
#include <iostream>
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<vector>
using namespace std;
const int maxn=100001;
const int inf=1<<30;
int gain[maxn],dist[maxn];
int stack[maxn],top;
int in[maxn],out[maxn];
int n,m;
vector<int> graph[maxn];
struct node
{
int
to;
struct node
*next;
}e[maxn];
int edgeini(int n)
{
for(int
i=1;i<=n;i++) graph[i].clear();
}
int topo()
{
for(int
i=1;i<=n;i++) dist[i]=-inf;
int
top=0;
for(int
i=1;i<=n;i++)
if(!in[i])
{
dist[i]=gain[i];
stack[++top]=i;
}
int
k=0;
while(top<n)
{
int t=stack[++k];
for(int j=0;j<graph[t].size();j++)
{
int v=graph[t][j];
in[v]--;
if(!in[v])
{
stack[++top]=v;
}
if(dist[v]<dist[t]+gain[v])
dist[v]=dist[t]+gain[v];
}
}
}
int main()
{
//
freopen("in.txt","r",stdin);
while(scanf("%d
%d",&n,&m)!=EOF)
{
edgeini(n);
memset(in,0,sizeof(in));
memset(out,0,sizeof(out));
for(int i=1;i<=n;i++)
scanf("%d",&gain[i]);
for(int i=1;i<=m;i++)
{
int from,to;
scanf("%d %d",&from,&to);
in[to]++;
out[from]++;
graph[from].push_back(to);
}
topo();
int ans=-inf;
for(int i=1;i<=n;i++)
if(!out[i]&&dist[i]>ans)
ans=dist[i];
printf("%d\n",ans);
}
return
0;
}