30pts求助
  • 板块P4943 密室
  • 楼主Dreamer_tang
  • 当前回复1
  • 已保存回复1
  • 发布时间2024/10/17 19:53
  • 上次更新2024/10/17 21:41:15
查看原帖
30pts求助
1067982
Dreamer_tang楼主2024/10/17 19:53

RT

#include<bits/stdc++.h>
using namespace std;
#define ll long long
ll n,m,k;
ll d[100010];
ll ver[1001000],edge[1001000],head[1001000],nxt[1001000];
ll d1[100100],d2[100010],d3[100010],d4[100100];
ll tot;
ll v[100100];
ll g,h;
void add(ll x,ll y,ll z)
{
    ver[++tot]=y,edge[tot]=z,nxt[tot]=head[x],head[x]=tot;
}
void dij1()
{
    memset(v,0,sizeof(v));
    memset(d1,0x3f,sizeof(d1));
    priority_queue< pair<ll,ll> > q;
    q.push(make_pair(0,1));
    v[1]=1;
    d1[1]=0;
    while(!q.empty())
    {
		ll x=q.top().second;
		q.pop();
		for(int i=head[x];i;i=nxt[i])
		{
			ll y=ver[i],z=edge[i];
			if(v[y])
			    continue;
			v[y]=1;
			if(d1[y]>d1[x]+z)
			{
				d1[y]=d1[x]+z;
				q.push(make_pair(-d1[y],y));
			}
		}
	}
}
void dij2()
{
    memset(v,0,sizeof(v));
    memset(d2,0x3f,sizeof(d2));
    priority_queue< pair<ll,ll> > q;
    q.push(make_pair(0,1));
    v[1]=1;
    d2[1]=0;
    while(!q.empty())
    {
		ll x=q.top().second;
		q.pop();
		for(int i=head[x];i;i=nxt[i])
		{
			ll y=ver[i],z=edge[i];
			if(v[y])
			    continue;
			if(d[y])
			    continue;
			v[y]=1;
			if(d2[y]>d2[x]+z)
			{
				d2[y]=d2[x]+z;
				q.push(make_pair(-d2[y],y));
			}
		}
	}
}
void dij3()
{
    memset(v,0,sizeof(v));
    memset(d3,0x3f,sizeof(d3));
    priority_queue< pair<ll,ll> > q;
    q.push(make_pair(0,g));
    v[g]=1;
    d3[g]=0;
    while(!q.empty())
    {
		ll x=q.top().second;
		q.pop();
		for(int i=head[x];i;i=nxt[i])
		{
			ll y=ver[i],z=edge[i];
			if(v[y])
			    continue;
			v[y]=1;
			if(d3[y]>d3[x]+z)
			{
				d3[y]=d3[x]+z;
				q.push(make_pair(-d3[y],y));
			}
		}
	}
}
void dij4()
{
    memset(v,0,sizeof(v));
    memset(d4,0x3f,sizeof(d4));
    priority_queue< pair<ll,ll> > q;
    q.push(make_pair(0,h));
    v[h]=1;
    d4[h]=0;
    while(!q.empty())
    {
		ll x=q.top().second;
		q.pop();
		for(int i=head[x];i;i=nxt[i])
		{
			ll y=ver[i],z=edge[i];
			if(v[y])
			    continue;
			v[y]=1;
			if(d4[y]>d4[x]+z)
			{
				d4[y]=d4[x]+z;
				q.push(make_pair(-d4[y],y));
			}
		}
	}
}
int main()
{
	cin>>n>>m>>k;
	for(int i=1;i<=k;i++)
	{
		ll f;
		cin>>f;
		d[f]=1;
	}
	    
	for(int i=1;i<=m;i++)
	{
		ll a,b,c;
		cin>>a>>b>>c;
		add(a,b,c);
		add(b,a,c);
	}
	cin>>g>>h;
	dij1();
	dij2();
	dij3();
	dij4();
	ll ans=min(max(d1[g],d2[h]),min(max(d1[h],d2[g]),min(max(d1[h],d4[g]),max(d1[g],d3[h]))));
	cout<<ans<<endl;
}

自查好像是最短路错了,但找不到错误点,有大佬帮忙吗,谢谢

2024/10/17 19:53
加载中...