Dijkstra55分求助
查看原帖
Dijkstra55分求助
526895
WYZ20030051楼主2023/7/10 18:09

WA on #1,#2,#3,#4,#8

#include<iostream>
#include<cstdio>
#include<cmath>
#include<string>
#include<cstring>
#include<algorithm>
#include<cassert>
#include<stack>
#include<queue>
#include<vector>
#include<map>
#include<cstdlib>
using namespace std;
#define ll long long
#define ull unsigned long long
int read()
{
	int now=0,nev=1; 
	char c=getchar();
	while(c<'0' || c>'9') 
	{ 
		if(c=='-') 
			nev=-1; 
		c=getchar();
	}
	while(c>='0' && c<='9') 
	{ 
		now=(now<<1)+(now<<3)+(c&15); 
		c=getchar(); 
	}
	return now*nev;
}
const int MAXN=1e5+10;
const int MAXM=5e5+10;
int n,m,k;
int a[MAXN];
int head[MAXM],tt=0;
struct edge
{
	int to,nxt,dis;
}e[MAXM<<1];
void add(int x,int y,int z)
{
	e[++tt].nxt=head[x];
	head[x]=tt;
	e[tt].to=y;
	e[tt].dis=z;
}
struct node
{
	int u;
	ll d;
	bool operator < (const node&x)const
	{
		return d>x.d;
	}
};
ll dis[2][MAXN];//要跑两遍Dijkstra,dis[0][u]表示正着跑,dis[1][u]表示反着跑 
int color[2][MAXN];
int fx[MAXM],fy[MAXM],fz[MAXM];
priority_queue<node>q;
void Dijkstra(int id)
{
	memset(dis[id],60,sizeof(dis[id]));
	memset(color[id],0,sizeof(color[id]));
	for(int i=1;i<=k;i++)
	{
		dis[id][a[i]]=0;
		color[id][a[i]]=a[i];
		q.push((node){a[i],0}); 
	}
	while(!q.empty())
	{
		node first=q.top();
		q.pop();
		int u=first.u;
		ll d=first.d;
		if(d!=dis[id][u])
			continue;
		for(int i=head[u];i;i=e[i].nxt)
		{
			int v=e[i].to;
			ll w=e[i].dis;
			if(dis[id][v]>dis[id][u]+w)
			{
				dis[id][v]=dis[id][u]+w;
				color[id][v]=color[id][u];
				q.push((node){v,dis[id][v]});
			}
		}
	}
}
int main()
{
	int t;
	t=read();
	while(t--)
	{
		memset(head,0,sizeof(head));
		n=read(),m=read(),k=read();
		for(int i=1;i<=m;i++)
		{
			int x,y,z;
			x=read(),y=read(),z=read();
			fx[i]=x,fy[i]=y,fz[i]=z;
			if(x!=y)
				add(x,y,z);
		}
		for(int i=1;i<=k;i++)
			a[i]=read();
		Dijkstra(0);//正着跑Dijkstra 
		tt=0;
		memset(head,0,sizeof(head));
		for(int i=1;i<=m;i++)
		{
			if(fx[i]!=fy[i])
				add(fy[i],fx[i],fz[i]);
		}
		Dijkstra(1);//反着跑Dijkstra
		ll ans=1e18;
		for(int i=1;i<=n;i++) 
		{
			int u=fx[i],v=fy[i],w=fz[i];
			if(color[0][u] && color[1][v] && color[0][u]!=color[1][v])
				ans=min(ans,dis[0][u]+dis[1][v]+w);
		}
		printf("%lld\n",ans);
	}
	return 0;
}
2023/7/10 18:09
加载中...