社区讨论

求调

P2656采蘑菇参与者 4已保存回复 7

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
7 条
当前快照
1 份
快照标识符
@mdfflo2g
此快照首次捕获于
2025/07/23 11:56
7 个月前
此快照最后确认于
2025/11/04 03:53
4 个月前
查看原帖
WA #7,8,9,10,求调。 代码:
CPP
#include<bits/stdc++.h>
#define int long long
using namespace std;

const int maxn = 2e5+5;
int n,m,root;
struct road
{
	int to,num;
	double k;
};
vector <road> G[maxn];
int dfn[maxn],low[maxn],dfncnt,scc[maxn],scccnt;
bool in_stack[maxn];
stack <int> s;
void dfs(int u)
{
	dfn[u] = low[u] = ++dfncnt;
	in_stack[u] = true;
	s.push(u);
	for(auto v : G[u])
	{
		if(!dfn[v.to])
		{
			dfs(v.to);
			low[u] = min(low[u],low[v.to]);
		}
		else
		{
			if(in_stack[v.to])
			{
				low[u] = min(low[u],dfn[v.to]);
			}
		}
	}
	if(dfn[u] == low[u])
	{
		scccnt++;
		while(s.top() != u && !s.empty())
		{
			scc[s.top()] = scccnt;
			in_stack[s.top()] = false;
			s.pop();
		}
		if(!s.empty())
		{
			scc[u] = scccnt;
		    in_stack[u] = false;
		    s.pop();
		}
	}
}
int nn,val[maxn],sum,x;
vector <road> nG[maxn];
set <pair <pair<int, int > ,pair<int, double > > > st;
void build()
{
	nn = scccnt;
	for(int u = 1; u <= n; u++)
	{
		for(auto v : G[u])
		{
			int nu = scc[u],nv = scc[v.to];
			if(nu != nv)
			{
				st.insert({ {nu,nv}, {v.num,v.k} } );
			}
			else
			{
				sum = 0,x = v.num;
				while(x > 0)
				{
					sum+=x;
					x*=v.k;
				}
				val[nu]+=sum;
			}
		}
	}
	for(auto g : st)
	{
		nG[g.first.first].push_back({g.first.second,g.second.first,g.second.second});
	}
}
int ans[maxn];
bool vis[maxn];
void spfa()
{
	queue <int> Q;
	memset(ans,0,sizeof(ans));
	memset(vis,0,sizeof(vis));
	ans[root] = val[root];
	vis[root] = 1;
	Q.push(root);
	while(!Q.empty())
	{
		int u = Q.front();
		Q.pop();
		vis[u] = 0;
		for(auto v : nG[u])
		{
			if(ans[u] + v.num + val[v.to] > ans[v.to])
			{
				ans[v.to] = ans[u] + v.num + val[v.to];
				if(!vis[v.to])
				{
					Q.push(v.to);
					vis[v.to] = 1;
				}
			}
		}
	}
}
signed main()
{
	ios::sync_with_stdio(0);
	cin.tie(0);
	cout.tie(0);
	cin >>n>>m;
	int u,v,snum;
	double kk;
	for(int i = 1; i <= m; i++)
	{
		cin >>u>>v>>snum>>kk;
		G[u].push_back({v,snum,kk});
	}
	cin >>root;
	dfs(1);
	build();
	root = scc[root];
	spfa();
	int maxn = -1;
	for(int i = 1; i <= nn; i++)
	{
		maxn = max(maxn,ans[i]);
	}
	cout <</*"\n"<<*/maxn;
}

回复

7 条回复,欢迎继续交流。

正在加载回复...