BZOJ 1179 ATM 图论 缩点+拓扑排序

给出一张有向图,图上每个点都有一个权值,然后有一些点是酒吧。给定一个起点,有一个抢劫犯从这里出发,可以走回到走过的点。最终要停在某一个酒店,求问权值最大和是多少。
首先考虑强联通分量里面所有的点,这些点要么都不取,要么全部要取出来。先对这张图缩点建图。此时对起点打上标记,然后拓扑排序转移答案。
最终的答案是所有酒店所在的强连通分量的答案的最大值。

#include
using namespace std;
typedef long long ll;
const int inf=0x3f3f3f3f;
const ll INF=LONG_LONG_MAX;
const int N=5e5+7;
int n,m,S,p; 
vector G[N];
vector H[N]; 
int w[N],tag[N],in[N];
ll dp[N];
int dfn[N],low[N],s[N],bel[N],val[N],top=0;
int tim=0,scc=0;
bool ins[N],go[N];


void tarjan(int u) {
	dfn[u]=low[u]=++tim;
	s[++top]=u,ins[u]=1;
	for(int i=0;i q;
	S=bel[S];
	go[S]=1;
	dp[S]=val[S];
	for(int i=1;i<=scc;i++) {
		if(in[i]==0) {
			q.push(i);
		}
	}
	while(!q.empty()) {
		int u=q.front();
		q.pop();
		for(int i=0;i ans;
	for(int i=1;i<=p;i++) {
		int x;
		scanf("%d",&x);
		ans.push_back(x);
	}
	solve();
	topo();
	ll res=0;
	for(int i=0;i

你可能感兴趣的:(比赛题解)