大神救命们,我没用结构体数组存边,我写的链式前向星,最后是把n个点的所有邻边都跑了一遍再重新建图然后跑拓扑,只过了2、6、8、10四个点
实在是调不出来了……QAQ
下面是代码
#include<bits/stdc++.h>
using namespace std;
typedef long long int ll;
const int N = 100010;
stack<int> s;
int dfn[N],low[N];
int h[N],e[N],ne[N],idx;
int hh[N],ee[N],nee[N],idxx;
int id[N];
bool st[N];
int timestamp;
int w[N];//存边权
int dist[N];
int in[N];//存入度
queue<int> q;
int n,m;
void add(int a,int b)
{
e[idx]=b,ne[idx]=h[a],h[a]=idx++;
}
void addd(int a,int b)
{
ee[idxx]=b,nee[idxx]=hh[a],hh[a]=idxx++;
}
void tarjan(int u)
{
dfn[u]=low[u]=++timestamp;
s.push(u);
st[u]=1;
for(int i=h[u];~i;i=ne[i])
{
int j=e[i];
if(!dfn[j])
{
tarjan(j);
low[u]=min(low[u],low[j]);
}
else if(st[j])
{
low[u]=min(low[u],dfn[j]);
}
}
if(dfn[u]==low[u])
{
int y;
while(y=s.top())
{
s.pop();
st[y]=0;
id[y]=u;
if(y==u)
{
break;
}
w[u]+=w[y];
}
}
}
int tp()//拓扑
{
for(int i=1;i<=n;i++)
{
if(id[i]==i&&!in[i])
{
q.push(i);
dist[i]=w[i];
}
}
while(!q.empty())
{
int t=q.front();
q.pop();
for(int i=hh[t];~i;i=nee[i])
{
int j=ee[i];
dist[j]=max(dist[j],dist[t]+w[j]);
in[j]--;
if(in[j]==0)
{
q.push(j);
}
}
}
int ans=0;
for(int i=1;i<=n;i++)
{
ans=max(ans,dist[i]);
}
return ans;
}
int main()
{
//start your program!
scanf("%d%d",&n,&m);
memset(h,-1,sizeof(h));
memset(hh,-1,sizeof(hh));
for(int i=1;i<=n;i++)
{
scanf("%d",&w[i]);
}
for(int i=1;i<=m;i++)
{
int a,b;
scanf("%d%d",&a,&b);
add(a,b);
}
for(int i=1;i<=n;i++)
{
if(!dfn[i])
{
tarjan(i);
}
}
for(int i=1;i<=n;i++)//重建图
{
for(int j=hh[i];~j;j=nee[j])
{
int k=ee[j];
if(id[i]!=id[k])
{
addd(i,k);
in[k]++;
}
}
}
printf("%d",tp());
return 0;
}
求救qwq