WA#1,3,4,5,7,9求条
查看原帖
WA#1,3,4,5,7,9求条
586689
K1ondra楼主2024/5/26 09:56
#include <bits/stdc++.h>
using namespace std;
const int MAXN=10005;
vector<int> adj[MAXN];
int low[MAXN],dfn[MAXN],bel[MAXN],weight[MAXN],indegree[MAXN], maxn[MAXN];
bool stackK[MAXN];
stack<int> st;
int timer,cmp;

void tarjan(int u) {
	low[u]=dfn[u]=++timer;
	st.push(u);
	stackK[u]=1;

	for (int i=0; i<adj[u].size(); i++) {
		int v=adj[u][i];
		if (!dfn[v]) {
			tarjan(v);
			low[u]=min(low[u],low[v]);
		} else if (stackK[v]) {
			low[u]=min(low[u],dfn[v]);
		}
	}

	if(low[u]==dfn[u]) {
		cmp++;
		int v;
		int sum=0;
		do {
			v=st.top();
			st.pop();
			stackK[v]=0;
			sum+=weight[v];
			bel[v]=cmp;
		} while (u!=v);
		maxn[cmp]=sum;
	}
}

int main() {
	int n,m;
	cin>>n>>m;

	for(int i=1; i<=n; i++) {
		cin>>weight[i];
	}

	for(int i=0; i<m; i++) {
		int u,v;
		cin>>u>>v;
		adj[u].push_back(v);
	}

	for (int i=1; i<=n; i++) {
		if (!dfn[i]) {
			tarjan(i);
		}
	}

	vector<int> weight(cmp+1,0);
	for (int u=1; u<=n; u++) {
		for (int j=0; j<adj[u].size(); j++) {
			int v=adj[u][j];
			if (bel[u]!=bel[v]) {
				indegree[bel[v]]++;
			}
		}
	}

	int ans=0;
	for(int i=1; i<=cmp; i++) {
		if (indegree[i]==0) {
			ans+=maxn[i];
		}
	}
	cout<<ans;
	return 0;
}

tarjan做的

2024/5/26 09:56
加载中...