下载了数据1,发现过了,结果交上去全WA,还发现不了错误......
查看原帖
下载了数据1,发现过了,结果交上去全WA,还发现不了错误......
344382
lmrttx楼主2020/12/16 20:56

求助,Thanks♪

#include<bits/stdc++.h>

using namespace std;

#define maxn 100010

#define maxm 500010

struct edge{
	int to,nxt,from;
}e[maxm],e1[maxm];

queue<int>q;

int cnt,head[maxn],cnt2;

int low[maxn],dfn[maxn],p[maxn],sd[maxn];

int sta[maxn],top;

bool vis[maxn];

int in[maxn],dis[maxn],tot,h[maxn];

int n,m,t,answer;

void add(int id,int v){
	e[++cnt].nxt=head[id];
	head[id]=cnt;
	e[cnt].from=id;
	e[cnt].to=v;
}

void Tarjan(int id){
	low[id]=dfn[id]=++t;
	sta[++top]=id;
	vis[id]=true;
	for(register int i=head[id];i;i=e[i].nxt){
		int v=e[i].to;
		if(!dfn[v]){
			Tarjan(v);low[id]=min(low[id],low[v]);
		}
		else if(vis[v]) low[id]=min(low[id],low[v]);
	}
	if(dfn[id]==low[id]){
		int v2;
		while(v2){
			v2=sta[top--];
			sd[v2]=id;vis[v2]=false;
			if(id==v2)break;
			p[id]+=p[v2];
		}
	}
}

int tuopu(){
	for(register int i=1;i<=n;i++){
		if(sd[i]==i&&!in[i]){
			q.push(i);dis[i]=p[i];
		}
	}
	while(!q.empty()){
		int u=q.front();
		q.pop();
		for(register int i=h[u];i;i=e1[i].nxt){
			int v=e1[i].to;
			dis[v]=max(dis[u]+p[v],dis[v]);
			in[v]--;
			if(in[v]==0)
			q.push(v);
		}
	}
	for(register int i=1;i<=n;i++){
		answer=max(answer,dis[i]);
	}
	return answer;
}

int main(){
	cin>>n>>m;
	for(register int i=1;i<=n;i++)cin>>p[i];
	for(register int i=1,u,v;i<=m;i++)cin>>u>>v,add(u,v);
	for(register int i=1;i<=n;i++)if(!dfn[i])Tarjan(i);
	for(register int i=1;i<=m;i++){
		int now=sd[e[i].from];
		int yy=sd[e[i].to];
		if(now!=yy){
			e1[++cnt2].nxt=h[now];e1[cnt2].to=yy;
			e1[cnt2].from=now;h[now]=cnt2;
			in[yy]++;
		}
	}
	cout<<tuopu()<<endl;
	return 0;
} 
2020/12/16 20:56
加载中...