社区讨论

80分求调

P2149[SDOI2009] Elaxia的路线参与者 3已保存回复 3

讨论操作

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

当前回复
3 条
当前快照
1 份
快照标识符
@m4xx30lg
此快照首次捕获于
2024/12/21 16:28
去年
此快照最后确认于
2025/11/04 12:32
4 个月前
查看原帖
WA9和hack
CPP
#include<bits/stdc++.h>
#define int long long
using namespace std;
struct mpm{
	int to,len;
	bool operator<(const mpm&x)const
	{
		return len>x.len;
	}
};
int in[600086];
bool b[600086];
vector<mpm>mp[600086];
vector<mpm>xm[600086];
vector<int> dj(int x)
{
	vector<int>s(600086,LONG_LONG_MAX);
	memset(b,0,sizeof b);
	priority_queue<mpm>oppo;
	oppo.push(mpm{x,0});
	s[x]=0;
	while(oppo.size()){
		mpm k=oppo.top();oppo.pop();
		if(b[k.to])continue;
		b[k.to]=1;
		for(int i=0;i<mp[k.to].size();i++)
		{
			if(s[mp[k.to][i].to]>s[k.to]+mp[k.to][i].len){
				s[mp[k.to][i].to]=s[k.to]+mp[k.to][i].len;
				oppo.push(mpm{mp[k.to][i].to,s[mp[k.to][i].to]});
			}
		}
	}
	return s;
}
int x[600086];
int y[600086];
int z[600086];
queue<int>oppo;
int s[600086];
signed main()
{
	int n,m;
	cin>>n>>m;
	int S1,E1,S2,E2;
	cin>>S1>>E1>>S2>>E2;
	for(int i=1;i<=m;i++)
	{
		scanf("%lld%lld%lld",&x[i],&y[i],&z[i]);
		mp[x[i]].push_back(mpm{y[i],z[i]});
		mp[y[i]].push_back(mpm{x[i],z[i]});
	}
	vector<int>F1=dj(S1);
	vector<int>F2=dj(E1);
	vector<int>F3=dj(S2);
	vector<int>F4=dj(E2);
	for(int i=1;i<=m;i++)
	{
		if((F1[x[i]]+F2[y[i]]+z[i]==F1[E1]||F1[y[i]]+F2[x[i]]+z[i]==F1[E1])&&(F3[x[i]]+F4[y[i]]+z[i]==F3[E2]||F3[y[i]]+F4[x[i]]+z[i]==F3[E2])){
			xm[x[i]].push_back(mpm{y[i],z[i]});
			in[y[i]]++;
		}
	}
	for(int i=1;i<=n;i++)
	{
		if(!in[i])oppo.push(i);
	}
	while(oppo.size()){
		int k=oppo.front();oppo.pop();
		for(int i=0;i<xm[k].size();i++)
		{
			s[xm[k][i].to]=max(s[xm[k][i].to],s[k]+xm[k][i].len);
			if(--in[xm[k][i].to]==0){
				oppo.push(xm[k][i].to);
			}
		}
	}
	int ans=0;
	for(int i=1;i<=n;i++)ans=max(ans,s[i]);
	cout<<ans;
	return 0;
}

回复

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

正在加载回复...