P5304 [GXOI/GZOI2019]旅行者
链接;https://www.luogu.com.cn/problem/P5304
题目描述:给定一个个点条边的有向图,求个点中任意两点的最短路。
题解:由于有个关键点,我们可以把它看作的"加油站",于是我们可以跑正反两图最短路然后算将每一个点的贡献即可。
#include<iostream>
#include<cstdio>
#include<queue>
using namespace std;
struct node
{
int v,data,nxt;
};
node edge[2][1000001];
long long T,n,m,K,x,y,res,in[100001],pv[2][100001],head[2][100001],d[100001],len[2],dis[2][100001];
bool used[100001];
void add(int k,int x,int y,int z)
{
edge[k][++len[k]].v=y;
edge[k][len[k]].data=z;
edge[k][len[k]].nxt=head[k][x];
head[k][x]=len[k];
return;
}
int read()
{
char c=0;
int sum=0;
while (c<'0'||c>'9')
c=getchar();
while ('0'<=c&&c<='9')
{
sum=sum*10+c-'0';
c=getchar();
}
return sum;
}
struct reads
{
long long num,data;
bool operator < (const reads &a)const
{
return data>a.data;
}
};
reads tmp;
reads make_reads(int x,int y)
{
tmp.num=x;
tmp.data=y;
return tmp;
}
void dijkstra(int k)
{
priority_queue<reads>q;
int top;
for (int i=1;i<=n;++i)
dis[k][i]=1e18,used[i]=0;
for (int i=1;i<=K;++i)
{
dis[k][d[i]]=0;
pv[k][d[i]]=d[i];
q.push(make_reads(d[i],0));
}
while (!q.empty())
{
top=q.top().num;
q.pop();
if (used[top])
continue;
used[top]=1;
for (int i=head[k][top];i>0;i=edge[k][i].nxt)
if (dis[k][edge[k][i].v]>dis[k][top]+edge[k][i].data)
{
dis[k][edge[k][i].v]=dis[k][top]+edge[k][i].data;
pv[k][edge[k][i].v]=pv[k][top];
q.push(make_reads(edge[k][i].v,dis[k][edge[k][i].v]));
}
}
return;
}
int main()
{
int x,y,z;
T=read();
while (T--)
{
res=len[0]=len[1]=0;
for (int i=1;i<=n;++i)
head[0][i]=head[1][i]=0;
n=read(),m=read(),K=read();
for (int i=1;i<=m;++i)
{
x=read(),y=read(),z=read();
add(0,x,y,z);
add(1,y,x,z);
}
for (int i=1;i<=K;++i)
d[i]=read();
dijkstra(0),dijkstra(1);
res=1e18;
for (int i=1;i<=n;++i)
for (int j=head[0][i];j>0;j=edge[0][j].nxt)
if (pv[0][i]!=pv[1][edge[0][j].v])
res=min(res,dis[0][i]+dis[1][edge[0][j].v]+edge[0][j].data);
printf("%lld\n",res);
}
return 0;
}
作者:zhouhuanyi
出处:https://www.cnblogs.com/zhouhuanyi/p/16983740.html
版权:本作品采用「署名-非商业性使用-相同方式共享 4.0 国际」许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现