55pts RE求助
查看原帖
55pts RE求助
177070
暗ざ之殇楼主2020/11/28 18:51
#include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdio>
#include<vector>
#include<queue>
#define ll long long
using namespace std;
inline ll read()
{
	char ch=getchar();
	ll a=0,x=1;
	while(ch<'0'||ch>'9')
	{
		if(ch=='-') x=-x;
		ch=getchar();
	}
	while(ch>='0'&&ch<='9')
	{
		a=(a<<1)+(a<<3)+(ch^48);
		ch=getchar();
	}
	return a*x;
}
const ll N=5e5+5;
const ll M=1e7;
const ll INF=1e9;
ll n,m,edge;
ll head[N],S[5],dis[N][5],ans[N];
bool vis[N],Short[N];
struct node
{
	ll from,to,nxt,dis;
}a[M];
void add(ll from,ll to,ll dis)
{
	edge++;
	a[edge].from=from;
	a[edge].to=to;
	a[edge].dis=dis;
	a[edge].nxt=head[from];
	head[from]=edge;
}
void SPFA1(ll Ty)
{
	for(ll i=1;i<=n;i++)
	{
		vis[i]=0;
		dis[i][Ty]=INF;
	}
	dis[S[Ty]][Ty]=0;
	queue<ll> q;
	q.push(S[Ty]);
	while(!q.empty())
	{
		ll u=q.front();
		q.pop();
		vis[u]=0;
		for(ll i=head[u];i;i=a[i].nxt)
		{
			ll v=a[i].to;
			ll w=a[i].dis;
			if(dis[v][Ty]>dis[u][Ty]+w)
			{
				
				dis[v][Ty]=dis[u][Ty]+w;
				if(!vis[v]) q.push(v),vis[v]=1;
			}
		}
	}
}
void SPFA()
{
	for(ll i=1;i<=n;i++)
	{
		dis[i][0]=INF;
		vis[i]=0;
	}
	dis[S[1]][0]=0;
	queue<ll> q;
	q.push(S[1]);
	while(!q.empty())
	{
		ll u=q.front();
		q.pop();
		vis[u]=0;
		for(ll i=head[u];i;i=a[i].nxt)
		{
			ll v=a[i].to;
			ll w=a[i].dis;
			if(dis[v][1]==dis[u][1]+w)
			{
				ans[v]=max(ans[v],ans[u]+w*Short[i]);
				if(!vis[v]) q.push(v),vis[v]=1;
			}
		}
	} 
}
int main()
{
	n=read();m=read();
	S[1]=read();S[2]=read();S[3]=read();S[4]=read();
	for(ll i=1;i<=m;i++)
	{
		ll u=read();
		ll v=read();
		ll w=read();
		add(u,v,w);
		add(v,u,w);
	}
	SPFA1(1);SPFA1(2);SPFA1(3);SPFA1(4);
	for(ll i=1;i<=edge;i++)
	{
		ll u=a[i].from;
		ll v=a[i].to;
		ll w=a[i].dis;
		if(dis[u][1]+w+dis[v][2]==dis[S[2]][1]||dis[u][2]+w+dis[v][1]==dis[S[2]][1])
		{
			if(dis[u][3]+w+dis[v][4]==dis[S[4]][3]||dis[u][4]+w+dis[v][3]==dis[S[4]][3])
			    Short[i]=1;
		}  
	}
	SPFA();
	printf("%lld\n",ans[S[2]]);
	return 0;    
}

思路和题解差不多,是 44spfaspfa 预处理,然后判断每条边是否在两者公共最短路径上,在的话标记一下,最后再来一遍 spfaspfa 求出所有最短路上所标记的边之和最大。

但是有 #6,7,8,9,10 RERE 了,数组好像也开得够大了,再开大点就会 TLETLE,更迷的是开了 O2O_2 之后 RERE 的点全部 TLETLE,求大佬帮助qwqqwq

2020/11/28 18:51
加载中...