博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
洛谷 P1342 请柬
阅读量:4507 次
发布时间:2019-06-08

本文共 1341 字,大约阅读时间需要 4 分钟。

这道题很适合作为P1629的加强版

因为这道题其实体现了反向建图的高效性

反向建图后:

单终点最短路径→单源最短路径。

因此两边Dij,然后再累计和即可

代码部分不难弄。直接上

先说明以下程序,有1的变量名与第一次dij有关(学生出来)

带2的与第二次dij有关(学生回家)

#include
#include
#include
#include
#include
using namespace std;int n,m;int h1[2100000],h2[2100000];int s1,s2;struct edge{int next,to,dis;};int v1[2100000],v2[2100000]; //注意数据范围long long d1[2100000],d2[2100000];edge e1[2100000],e2[2100000];void addedge1(int next,int to,long long dis){e1[++s1].dis=dis;e1[s1].next=h1[next];e1[s1].to=to;h1[next]=s1;}void addedge2(int next,int to,long long dis){e2[++s2].dis=dis;e2[s2].to=to;e2[s2].next=h2[next];h2[next]=s2;}void dij1(int start){priority_queue
> q; //这是优先队列的一个比较容易理解的写法,之所以long long 是因为可总和可能爆intmemset(d1,0x3f,sizeof(d1));memset(v1,0,sizeof(v1));q.push(make_pair(0,start));d1[1]=0;while(!q.empty()){int i,j;long long k;int t=q.top().second;q.pop();if(v1[t]) continue;v1[t]=1;for(i=h1[t];i;i=e1[i].next){j=e1[i].to;k=e1[i].dis;if(d1[t]+k
> q; memset(d2,0x3f,sizeof(d2));memset(v2,0,sizeof(v2));q.push(make_pair(0,start));d2[1]=0;while(!q.empty()){int i,j;long long k;int t=q.top().second;q.pop();if(v2[t]) continue;v2[t]=1;for(i=h2[t];i;i=e2[i].next){j=e2[i].to;k=e2[i].dis;if(d2[t]+k

 

转载于:https://www.cnblogs.com/zsx6/p/11059237.html

你可能感兴趣的文章
uva 10405 - Longest Common Subsequence(最长公共子序列)
查看>>
跨库数据表的运算
查看>>
88svg子标签(示例)
查看>>
IOS学习笔记 O1
查看>>
埃及分数 ----- 迭代加深搜索
查看>>
377. Combination Sum IV
查看>>
416. Partition Equal Subset Sum
查看>>
C#使用反射得到属性然后创建xml文档
查看>>
Java重试机制
查看>>
u盘超级加密3000使用方法
查看>>
初识CoreText
查看>>
ADO.NET Entities Framework 的增删查改
查看>>
nlogn数据结构代码
查看>>
ORA-12519: TNS:no appropriate service handler found 解决
查看>>
css解决td单元格内文字溢出
查看>>
特斯拉的疯狂
查看>>
堆排序
查看>>
【译】3 ways to define a JavaScript class
查看>>
vim 基础学习之替换
查看>>
C#中三层架构UI、BLL、DAL、Model实际操作
查看>>