求调,40分,好像输出变成0了...c⌒っ゚Д゚)っ
查看原帖
求调,40分,好像输出变成0了...c⌒っ゚Д゚)っ
259944
__凉皮__楼主2021/8/22 09:53

调了一个晚上了,彻底晕了,改来改去都是40分啊w(゚Д゚)w,求救各位大佬!┭┮﹏┭┮

不过1,4,5,9这4个点都是因为输出变成0,也不知道为什么...

#include<bits/stdc++.h>
using namespace std;
#define N 200001
int ne[N],he[N],w[N],to[N],fr[N],k,p[N];
int low[N],ins[N],in[N],dfn[N],cnt,tot;
int ru[N],dis[N],ans;
stack<int> s;
void tarjan(int x){
	s.push(x);
	ins[x]=1;
	low[x]=dfn[x]=++cnt;
	for(int i=he[x];i;i=ne[i]){
		int t=to[i];
		if(!dfn[t]){
			tarjan(t);
			low[x]=min(low[x],low[t]);
		}
		else if(ins[x])low[x]=min(low[x],dfn[t]);
	}
	if(low[x]==dfn[x]){
		tot++;
		int t;
		while(t=s.top()){
			ins[t]=0;
			in[t]=tot;
			p[tot]+=w[t];
			s.pop();
			if(t==x)break;	
		}
	}
}
int topu(){
	queue<int> q;
	for(int i=1;i<=tot;i++)if(!ru[i])q.push(i),dis[i]=p[i];
	while(!q.empty()){
		int x=q.front();
		q.pop();
		for(int i=he[x];i;i=ne[i]){
			int t=to[i];
			ru[t]--;
			dis[t]=max(dis[x]+p[t],dis[t]);
			if(ru[t]==0)q.push(t);
		}
	}
	for(int i=1;i<=tot;i++)if(dis[i]>ans)ans=dis[i];
	return ans;
}
void add(int x,int y){
	k++;
	fr[k]=x;
	to[k]=y;
	ne[k]=he[x];
	he[x]=k;
}
int main(){
	int n,m;
	scanf("%d%d",&n,&m);
	for(int i=1;i<=n;i++)scanf("%d",&w[i]);
	for(int i=1;i<=m;i++){
		int x,y;
		scanf("%d%d",&x,&y);
		add(x,y);
	}
	for(int i=1;i<=n;i++)if(!dfn[i])tarjan(i);
	k=0;
	for(int i=1;i<=m;i++){
		int t=in[to[i]],f=in[fr[i]];
		if(f!=t){
			add(f,t);
			ru[t]++;
		}
	}
	//cout<<tot;
	cout<<topu();
	system("pause");
   	return 0;
}
2021/8/22 09:53
加载中...