tarjan 40pts求助
查看原帖
tarjan 40pts求助
442644
DTCT楼主2022/1/26 16:31

https://www.luogu.com.cn/record/68021406 #1,3,4,5,7,9WA了

#include<cstdio>
class IO{
	char qu[55],c;
	int qr;
	bool f;
public:
	template<typename T>
	IO&operator>>(T&x){
		for(f=1,c=getchar();c<48||c>57;c=getchar())
			f^=c=='-';
		for(x=0;c<=57&&c>=48;c=getchar())
			x=(x<<1)+(x<<3)+(c&15);
		x=f?x:-x;
		return*this;
	}
	template<typename T>
	IO&operator<<(T x){
		if(!x) putchar(48);
		else{
			if(x<0) putchar('-'),x=-x;
			while(x) qu[++qr]=x%10^48,x/=10;
			while(qr) putchar(qu[qr--]);
		}
		return*this;
	}
	IO&operator<<(const char&ch){
		putchar(ch);
		return*this;
	}
	IO&operator<<(const char*s){
		for(int i=0;s[i];++i)
			putchar(s[i]);
		return*this;
	}
}cio;
#include<vector>
#include<queue>
#define Min(x,y) (x<y?x:y)
#define Max(x,y) (x<y?y:x)
#define MX 10001
int n,m;
class Graph{
	//graph
	std::vector<int>g[MX];
	int w[MX];
	//tarjan
	int s[MX],top=0,vis[MX];
	int low[MX],dfn[MX],ti;
	//new graph
	std::vector<int>gg[MX];
	int ww[MX],col[MX],cn;
	//topo_sort
	std::queue<int>q;
	int inm[MX],ans[MX];
public:
	void Add(int u,int v){
		g[u].push_back(v);
	}
	void W(int u,int w_){
		w[u]=w_;
	}
	void Tarjan(int u){
		vis[u]=true;
		dfn[u]=low[u]=++ti;
		s[++top]=u;
		for(int i=0;i<g[u].size();i++){
			int v=g[u][i];
			if(!dfn[v]){
				Tarjan(v);
				low[u]=Min(low[u],low[v]);
			}
			else
				low[u]=Min(low[u],low[v]);
		}
		if(dfn[u]==low[u]){
			int v;
			cn++;
			while(v=s[top--]){
				col[v]=cn;
				vis[v]=false;
				ww[u]+=w[v];
				if(u==v)
					break;
			}
		}
	}
	int Topo_sort(){
		for(int i=1;i<=cn;i++)
			if(!inm[i])
				q.push(i);
		while(!q.empty()){
			int u=q.front();
			q.pop();
			for(int i=0;i<gg[u].size();i++){
				int v=gg[u][i];
				ww[v]=Max(ww[v],ww[u]+w[v]);
				inm[v]--;
				if(!inm[v])
					q.push(v);
			}
		}
		int ans=0;
		for(int i=1;i<=n;i++)
			ans=Max(ans,ww[i]);
		return ans;
	}
	void Suo_Dian(){
		for(int i=1;i<=n;i++)
			if(!dfn[i])
				Tarjan(i);
		for(int u=1;u<=n;u++)
			for(int i=0;i<g[u].size();i++){
				int v=g[u][i];
				if(u!=v){
					gg[u].push_back(v);
					inm[col[v]]++;
				}
			}
	}
}g;
int main(){
	int u,v,temp;
	cio>>n>>m;
	for(int i=1;i<=n;i++){
		cio>>temp;
		g.W(i,temp);
	}
	for(int i=1;i<=m;i++){
		cio>>u>>v;
		g.Add(u,v);
	}
	g.Suo_Dian();
	cio<<g.Topo_sort();
	return 0;
}
2022/1/26 16:31
加载中...