70分求助!不知为何WA
  • 板块学术版
  • 楼主OMITW
  • 当前回复2
  • 已保存回复2
  • 发布时间2023/7/12 21:02
  • 上次更新2023/11/3 10:13:58
查看原帖
70分求助!不知为何WA
442437
OMITW楼主2023/7/12 21:02

题目:采蘑菇

70分代码

#include<bits/stdc++.h>
using namespace std;
const int MAXN=2e5+5;
int m,n,x[MAXN],y[MAXN],sum[MAXN],cs[MAXN],dp[MAXN],u[MAXN],s;
int dfn[MAXN],low[MAXN],bj[MAXN],zh[MAXN],len,sl;
double hf[MAXN];
map<int,int> pr[MAXN];
stack<int> q;
queue<int> w;
vector<int> g[MAXN],p[MAXN];
void tarjan(int x)
{
	dfn[x]=low[x]=++len;
	zh[x]=1;
	q.push(x);
	for(int i=0;i<g[x].size();i++)
		if(!dfn[g[x][i]])
		{
			tarjan(g[x][i]);
			low[x]=min(low[x],low[g[x][i]]);
		}
		else if(zh[g[x][i]])low[x]=min(low[x],low[g[x][i]]);
	if(dfn[x]==low[x])
	{
		sl++;
		while(q.top()!=x)
		{
			bj[q.top()]=sl;
			zh[q.top()]=0;
			q.pop();
		}
		bj[q.top()]=sl;
		zh[q.top()]=0;
		q.pop();
	}
}
int dijkstra(int x)
{
	memset(dp,128,sizeof(dp));
	int k=0;
	dp[x]=sum[x];
	u[x]=1;
	w.push(x);
	while(!w.empty())
	{
		x=w.front();
		w.pop();
		u[x]=0;
		k=max(k,dp[x]);
		for(int i=0;i<p[x].size();i++)
			if(dp[x]+pr[x][p[x][i]]+sum[p[x][i]]>dp[p[x][i]])
			{
				dp[p[x][i]]=dp[x]+pr[x][p[x][i]]+sum[p[x][i]];
				if(!u[p[x][i]])
				{
					u[p[x][i]]=1;
					w.push(p[x][i]);
				}
			}
	}
	return k;
}
int main()
{
	cin>>m>>n;
	for(int i=1;i<=n;i++)
	{
		cin>>x[i]>>y[i]>>cs[i]>>hf[i];
		g[x[i]].push_back(y[i]);
	}
	for(int i=1;i<=m;i++)
		if(!dfn[i])tarjan(i);
	for(int i=1;i<=n;i++)
		if(bj[x[i]]==bj[y[i]])
		{
			hf[i]*=10;
			while(cs[i])sum[bj[x[i]]]+=cs[i],cs[i]=cs[i]*int(hf[i])/10;
		}
		else pr[bj[x[i]]][bj[y[i]]]=cs[i];
	for(int i=1;i<=m;i++)
		for(int j=0;j<g[i].size();j++)
			if(bj[i]!=bj[g[i][j]])p[bj[i]].push_back(bj[g[i][j]]);
	cin>>s;
	cout<<dijkstra(bj[s]);
	return 0;
}
2023/7/12 21:02
加载中...