救救孩子吧,调不对呀
查看原帖
救救孩子吧,调不对呀
230808
Zxsoul楼主2020/10/25 16:55
/*
Name:
Author:BZQ
Date: 
*/
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <algorithm>
#include <vector>
#include<queue>
using namespace std;
typedef long long ll;

const int manx=1e6+10;
const int mamx = 1e6 + 11;
const int B = 1e6 + 11;
const int mod = 1e9 + 7;
const int inf = 0x3f3f3f3f;

inline int read() {
  char c = getchar(); int x = 0, f = 1;
  for ( ; !isdigit(c); c = getchar()) if (c == '-') f = -1;
  for ( ; isdigit(c); c = getchar()) x = x * 10 + (c ^ 48);
  return x * f;
}
queue<int> q;
struct node{
	int u,v,nxt,w;
}e[manx<<1];
int sum[manx],top,st[manx],head[manx],cnt,n,m,low[manx],lt[manx],re,dfn[manx],js;
int add(int u,int v){
	e[++cnt].nxt = head[u];
	e[cnt].u = u;
	e[cnt].v = v;
	head[u] = cnt;
}
struct tap{
	int u,v,x;
}len[manx<<1];
int rd[manx],cd[manx],a[manx],null,f[manx];

void tarjan(int u){
	dfn[u] = low[u] = ++js;
	st[++top] = u;
	for(int i = head[u];i;i = e[i].nxt )
	{
		int v = e[i].v ;
		if(!dfn[v]){
			tarjan(v);
			low[u] = min(low[u],low[v]);
		}else
		{
			if(!lt[v]){
				low[u] = min(dfn[v],low[u]);
			}
		}
	}
	if(dfn[u] == low[u]){
		lt[u] = ++re;
		sum[re] = len[u].x;
		while(st[top] != u) 
		{
			sum[re] += len[st[top]].x;
			lt[st[top]] = re;
			top--;
			//cout<<re<<" "<<sum[re]<<endl;	
		}
		top --;
	}
}
node ee[manx<<1];
int headd[manx],ans,zxs,cntt;
int addd(int u ,int v){
	ee[++cntt].u = u;
	ee[cntt].nxt = headd[u];
	ee[cntt].v = v;
	headd[u] = cntt; 
}

int  tuopu(){
	for(int i = 1;i <= re ;i ++){
		if(rd[i]==0)
		{
			q.push(i);
			a[i] = sum[i];	
		}
	}
	while(!q.empty()){
		int u = q.front();
		q.pop();
		for(int i = headd[u];i;i = ee[i].nxt){
			int v = ee[i].v ;
			a[v] = max(a[v],a[u]+sum[v]);
			rd[v]--;
			if(rd[v]==0)
			q.push(v); 
		}
	}
	int jj = 0;
	for(int i = 1;i <= re; i++){
		jj = max(jj,a[i]);
		return jj;
	}
}

int main(){
    n = read();
    m = read();
    for(int i = 1;i <= n ;i ++)
    {
    	len[i].x = read();
	}
	for(int i = 1;i <= m; i++){
		int x = read(),y = read();
		add(x,y);
	}
	for(int i = 1;i <= n ;i ++){
		if(!dfn[i])
		tarjan(i);
	}
	for(int i = 1;i <= n;i++)
	for(int j = head[i];j;j = e[j].nxt ){
		int v = e[j].v;
		if(lt[i] != lt[v])
		{
			addd(lt[i],lt[v]);
		}
	}
	for(int i = 1;i <= re; i++)
	for(int j = headd[i];j;j = ee[j].nxt )
	{
		int v = ee[j].v ;
		cd[i]++;
		rd[v]++;
	}
	cout<<tuopu();
	return 0;
}


2020/10/25 16:55
加载中...