P1073 [NOIP2009 提高组] 最优贸易测试点有问题
查看原帖
P1073 [NOIP2009 提高组] 最优贸易测试点有问题
932933
AC_NOIP_AK_IOI楼主2023/3/11 18:24

这一题,我第五个测试点明明是对的,它却说我错??

https://www.luogu.com.cn/record/104384369

第五个测试点: 10 20

100 89 100 72 39 50 74 50 50 1

1 2 1

1 3 1

1 4 1

2 5 1

1 5 1

3 5 1

2 3 1

2 4 1

3 4 1

4 5 1

1 6 1

6 7 1

1 8 1

6 9 1

9 10 1

1 7 1

6 8 1

8 9 1

1 10 1

7 8 1

我的输出:24

正确输出:24

代码:

#include<bits/stdc++.h>
using namespace std;
int minn[1000001],n,m,maxn[1000001],a[1000001],sum;
vector<int>adj[1000001];
vector<int>adjj[1000001];
void spfa(int s)
{
	queue<int> q;
	memset(minn,127,sizeof(minn));
	minn[s]=a[s];
	q.push(s);
	bool flag[1000001];
	flag[s]=1;
	while(!q.empty())
	{
		int tt=q.front();
		q.pop();
		flag[tt]=0;
		for(int i=0;i<adj[tt].size();i++)
		{
			int ttt=adj[tt][i];
			if(minn[ttt]>min(minn[tt],a[ttt]))
			{
				minn[ttt]=min(minn[tt],a[ttt]);
				if(!flag[ttt])
				{
					q.push(ttt);
					flag[ttt]=1;
				}
			}
		}
	}
}
void sfa11(int a1)
{
	maxn[a1]=a[a1];
	queue<int> q;
	q.push(a1);
	bool flag[1000001];
	flag[a1]=1;
	while(!q.empty())
	{
		int tt=q.front();
		q.pop();
		flag[tt]=0;
		for(int i=0;i<adjj[tt].size();i++)
		{
			int ttt=adjj[tt][i];
			if(maxn[ttt]<max(maxn[tt],a[ttt]))
			{
				maxn[ttt]=max(maxn[tt],a[ttt]);
				if(!flag[ttt])
				{
					q.push(ttt);
					flag[ttt]=1;
				}
			}
		}
	}
}
int main()
{
	cin>>n>>m;
	for(int i=1;i<=n;i++)cin>>a[i];
	for(int i=1;i<=m;i++)
	{
		int x,y,z;
		cin>>x>>y>>z;
		if(z==1)
		{
			adj[x].push_back(y);
			adjj[y].push_back(x);
		}
		else
		{
			adj[x].push_back(y);
			adj[y].push_back(x);
			adjj[x].push_back(y);
			adjj[y].push_back(x);
		}
	}
	spfa(1);
	sfa11(n);
	for(int i=1;i<=n;i++)
	{
		sum=max(sum,maxn[i]-minn[i]);
	}
	cout<<sum;
	return 0;
}
2023/3/11 18:24
加载中...