Elaxia的路线 88pts求调
  • 板块学术版
  • 楼主How1ver
  • 当前回复0
  • 已保存回复0
  • 发布时间2023/10/4 16:55
  • 上次更新2023/11/2 15:46:30
查看原帖
Elaxia的路线 88pts求调
510823
How1ver楼主2023/10/4 16:55
#include <bits/stdc++.h>
using namespace std;
struct Node
{
	int id,reach;
};
priority_queue <Node> q;
int n,m,s,dis[1505],dis1[1505],dis2[1505],dis3[1505],dis4[1505];
int a1,a2,b1,b2,d[1505],num[1505];
vector <int> v[1505],w[1505],v1[1505],w1[1505];
bool vis[1505];
bool operator <(const Node x,const Node y)
{
	return x.reach>y.reach;
}
void dijkstra()
{
	memset(dis,0x3f,sizeof(dis));
	dis[s]=0;
	q.push({s,0});
	while (!q.empty())
	{
		Node t=q.top();
		q.pop();
		if (vis[t.id])
		{
			continue;
		}
		vis[t.id]=true;
		for (int i=0;i<v[t.id].size();i++)
		{
			int tt=v[t.id][i];
			if (dis[tt]>dis[t.id]+w[t.id][i])
			{
				dis[tt]=dis[t.id]+w[t.id][i];
				q.push({tt,dis[tt]});
			}
		}
	}
	for (int i=1;i<=n;i++)
	{
		vis[i]=false;
	}
}
void L()
{
	s=a1;
	dijkstra();
	for (int i=1;i<=n;i++)
	{
		dis1[i]=dis[i];
	}
	s=b1;
	dijkstra();
	for (int i=1;i<=n;i++)
	{
		dis2[i]=dis[i];
	}
	s=a2;
	dijkstra();
	for (int i=1;i<=n;i++)
	{
		dis3[i]=dis[i];
	}
	s=b2;
	dijkstra();
	for (int i=1;i<=n;i++)
	{
		dis4[i]=dis[i];
	}
}
int topsort()
{
	queue<int> q;
	for (int i=1;i<=n;i++)
	{
		if (d[i]==0)
		{
			q.push(i);
		}
	}
	int maxn=0;
	while (!q.empty())
	{
	    int f=q.front();
	    q.pop();
	    for (int i=0;i<v1[f].size();i++)
	    {
	    	int t=v1[f][i];
	    	d[t]--;
	    	num[t]=max(num[t],num[f]+w1[f][i]);
	    	maxn=max(maxn,num[t]);
	    	if (d[t]==0)
	    	{
	    		q.push(t);
	    	}
	    }
	}
	return maxn;
}
int main()
{
	cin>>n>>m;
	cin>>a1>>b1>>a2>>b2;
	for (int i=1;i<=m;i++)
	{
	    int x,y,z;
	    cin>>x>>y>>z;
	    v[x].push_back(y);
	    w[x].push_back(z);
	    v[y].push_back(x);
	    w[y].push_back(z);
	}
	L();
	for (int i=1;i<=n;i++)
	{
		for (int j=0;j<v[i].size();j++)
		{
			int fr=i,to=v[i][j];
			if (dis1[fr]+w[i][j]+dis2[to]==dis1[b1])
			{
				if (dis3[fr]+w[i][j]+dis4[to]==dis3[b2]||dis4[fr]+w[i][j]+dis3[to]==dis4[a2])
				{
					v1[fr].push_back(to);
					w1[fr].push_back(w[i][j]);
					d[to]++;
				}
			}
		}
	}
	cout<<topsort();
	return 0;
}
2023/10/4 16:55
加载中...