30pts只A了前三个点求助,答案算大了
  • 板块P2656 采蘑菇
  • 楼主lpx2024
  • 当前回复0
  • 已保存回复0
  • 发布时间2024/5/19 21:33
  • 上次更新2024/5/20 12:55:50
查看原帖
30pts只A了前三个点求助,答案算大了
537998
lpx2024楼主2024/5/19 21:33
#include<bits/stdc++.h>
using namespace std;
const int maxN=80010; 
struct node{
	int to,val,mx;
};
stack<int> s;
queue<int> q;
vector<node> v[maxN],v2[maxN];
int dfn[maxN],low[maxN],siz[maxN],bl[maxN],inn[maxN],dp[maxN],f[maxN],stp,y;
bool book[maxN];
void dfs(int x){
	low[x]=dfn[x]=++stp;
	s.push(x);
	book[x]=1;
	for(int i=0;i<v[x].size();i++){
		y=v[x][i].to;
		if(dfn[y]==0){
			dfs(y);
			low[x]=min(low[x],low[y]);
		}
		else if(book[y]==1) low[x]=min(low[x],low[y]);
	}
	if(dfn[x]==low[x]){
		do{
			y=s.top();
			s.pop();
			siz[x]++;
			bl[y]=x;
			book[y]=0;
		}while(x!=y);
	}
}
void find_cnt(int x){
	book[x]=1;
	for(int i=0;i<v[x].size();i++){
		int y=v[x][i].to;
		if(bl[y]==bl[x]){
			f[bl[x]]+=v[x][i].mx;
			if(!book[y]) find_cnt(y);
		} else {
			v2[bl[x]].push_back(node{bl[y],v[x][i].val,0});
			inn[bl[y]]++;
		}
	}
}
int main(){
	int n,m,st,a,b,c;
	double d;
	cin>>n>>m;
	for(int i=1;i<=m;i++){
		cin>>a>>b>>c>>d;
		int mx=0,e=c;
		while(e){
			mx+=e;
			e*=d;
		}
		v[a].push_back(node{b,c,mx});
	}
	cin>>st;
	dfs(st);
	memset(book,0,sizeof(book));
	for(int i=1;i<=n;i++){
		if(siz[i]){
		    find_cnt(i);
		    dp[i]=f[i];
		}
	}
	memset(book,0,sizeof(book));
	q.push(bl[st]);
	book[bl[st]]=1;
	//dp[bl[st]]=f[bl[st]];
	while(!q.empty()){
		int p=q.front();
		q.pop();
		for(int i=0;i<v2[p].size();i++){
			y=v2[p][i].to;
			inn[y]--;
			dp[y]=max(dp[y],dp[p]+v2[p][i].val+f[y]);
			if(!inn[y] && !book[y]){
				q.push(y);
				book[y]=1;
			}
		}
	} 
	int ans=0;
	for(int i=1;i<=n;i++) ans=max(ans,dp[i]);
	cout<<ans;
	return 0;
}
2024/5/19 21:33
加载中...