• 松弛:原来用一根橡皮筋连接p和w两点,现在有一点v到w的路径更短,现在把橡皮筋w点的另一端p换成v点,这样缓解橡皮筋紧绷的压力,让其变得松弛。
    来自:原博
  • 关于SPFA算法
    来自:原博
  • 链式前向星
#include <bits/stdc++.h>
using namespace std;
#define INF 0x3f3f3f3f//可以使用memset//链式前向星+SPFAstruct edge{int next;//下一条边的存储下标(默认0int to;//这条边终点int lenth;//权值}a[400020];//结构体数组edge存边,edge[i]表示第i条边int head[200020];// head[i]存以i为起点的最后一条边的编号
int n,m,q, nn;
int vis[200020];struct nodope{int val;      //val花费    d结束时的颜色set<int> d;
}d[200020];     //当前点int spfa()
{memset(vis,0,sizeof vis);vis[1] = 1;queue<int> q;q.push(1);for(int i=0;i<=n;i++){d[i].val=INF,d[i].d.clear();}d[1].val=0;while(!q.empty()){int u=q.front();q.pop();vis[u]=0;for(int i=head[u];i!=-1;i=a[i].next)//遍历以u为起点的点{int to = a[i].to;if(d[to].val>(d[u].val+(d[u].d.find(a[i].lenth)==d[u].d.end()))){d[to].val = d[u].val+(d[u].d.find(a[i].lenth)==d[u].d.end());d[to].d.clear();d[to].d.insert(a[i].lenth);if(!vis[to]){q.push(to);vis[to] = 1;}}else if(d[to].val==(d[u].val+(d[u].d.find(a[i].lenth)==d[u].d.end()))&&d[to].d.find(a[i].lenth)==d[to].d.end()){d[to].d.insert(a[i].lenth);if(!vis[to]){q.push(to);vis[to] = 1;}}}}if(d[n].val != INF)printf("%d\n",d[n].val);elseprintf("-1\n");return 0;
}void add(int x,int y,int z)
{//nn即cnt 为边的计数 从0开始计a[nn].lenth=z;//终点a[nn].to=y;//权值a[nn].next=head[x];//以x为起点上一条边的编号,也就是与这个边起点相同的上一条边的编号head[x]=nn++;//更新以x为起点的上一条边的编号//若以点i为起点的边新增了一条,在edge中的下标为j.//那么edge[j].next=head[i];然后head[i]=j.//即每次新加的边作为第一条边,最后倒序遍历/*题设是双向边*/a[nn].lenth=z;a[nn].to=x;a[nn].next=head[y];head[y]=nn++;
}int main()
{//freopen("2.txt","r",stdin);while(~scanf("%d%d",&n,&m)){for(int i = 0;i <= n;i++)head[i] = -1;//head初始化-1nn = 0;//cntfor(int i = 0;i < m;i++){int x, y, z;scanf("%d %d %d", &x, &y, &z);add(x, y, z);}spfa();}return 0;
}

SPFA 模板来自上?原博

#include <bits/stdc++.h>
#define inf 0x3f3f3f3f
using namespace std;const int M=10005;struct A{int y,time,next;
}a[M<<1];int pre[M],cent=0;//链式前向星数组
int vis[M],ven[M],nums[M];//SPFS数组,vis记录最短路,ven记录是否在队列,nums记录入队次数void add(int x,int y,int k)//链式前向星,加入节点
{a[cent].y=y, a[cent].time=k, a[cent].next=pre[x];pre[x]=cent++;
}bool SPFA(int s,int n)
{queue <int> q;memset(vis,inf,sizeof(vis));memset(ven,0,sizeof(ven));memset(nums,0,sizeof(nums));vis[s]=0;//初始化距离ven[s]=1,nums[s]++;//标记s节点在队列,队列次数+1q.push(s);while(!q.empty()){int x=q.front();q.pop();//出队ven[x]=0;//标记不在队列for(int i=pre[x]; ~i; i=a[i].next)//遍历与x节点连通的点{int y=a[i].y;if(vis[y]>vis[x]+a[i].time)//更新{vis[y]=vis[x]+a[i].time;if(!ven[y])//由于更新了节点,所以后续以这个为基础的最短路,也要更新下//所以如果在队列就不用加入,不在的话加入更新后续节点{q.push(y);ven[y]=1;//标记这个节点在队列中nums[y]++;//记录加入次数if(nums[y]>n)//如果这个点加入超过n次,说明存在负圈,直接返回return false;}}}}return true;
}int main()
{int n,m,t;int b[M],c[M];while(cin>>n>>m>>t){cent=0;memset(pre,-1,sizeof(pre));for(int i=0;i<n;i++){int x,y,k;cin>>x>>y>>k;add(x,y,k);add(y,x,k);}for(int i=0;i<m;i++){cin>>b[i];}for(int i=0;i<t;i++){cin>>c[i];}int minn=inf;for(int i=0;i<m;i++)//遍历多个找寻最小{SPFA(b[i],n);for(int j=0;j<t;j++)minn=min(minn,vis[c[j]]);}cout<<minn<<endl;}}

Day 7 A - Age of Moyu HDU 6386 | 最短路 | SPFA | 链式前向星相关推荐

  1. D - Age of Moyu HDU - 6386 -BFS+DFS分层最短路

    D - Age of Moyu HDU - 6386 题意:双向图,m条边,每条边有一个编号id,而花费就是根据这个id的变化来确定的求1-n的最短路 思路:全值为0,1的图直接bfs按层遍历图找到n ...

  2. 多校第七场A---Age of Moyu 链式前向星+Dijkstra

    这里借这个题讲一下什么是链式前向星和他的用处: 一.链式前向星 1.由来:我们都知道图的存储方式有链接矩阵,邻接表两种,邻接矩阵好写但是占内存大,数稍微大点的题目就开不下数组了(适合稠密图):邻接表的 ...

  3. 图论:SPFA 算法详解( 算法竞赛入门到进阶) HDU 2544 链式前向星 【提供ACM模板+图解,不会都难!】

    文章目录 SPFA简介 链式前向星介绍 SPFA算法思路详细 模板-链式前向星 参考书籍:算法竞赛入门到进阶 罗勇军 SPFA简介 用队列处理Bellman-Ford算法可以很好地优化,这种方法叫做S ...

  4. A - Age of Moyu HDU - 6386(Dijkstra+堆优化)

    要解决这道题,可以用dfs+bfs,但是我不会,所以我只会dijkstra算法: 要解决这道题必须明白迪杰斯特拉算法的核心思想,我是这样理解的: 我可以任意举例一个图: 比如这个图,那么求1-6的最短 ...

  5. dijstra + 链式前向星 一个人的旅行 HDU - 2066

    虽然草儿是个路痴(就是在杭电待了一年多,居然还会在校园里迷路的人,汗~),但是草儿仍然很喜欢旅行,因为在旅途中 会遇见很多人(白马王子,^0^),很多事,还能丰富自己的阅历,还可以看美丽的风景--草儿 ...

  6. hdu 6386 Age of Moyu (求最短路 优先队列)

    题意: 有n个点m条边   n个点编号为1~n   每条边都有一个值  从一条边到另一条边,如果两边的指不同 花费就要+1,如果相同就不需要花费. 先从1走到n问最小花费是多少.(一开始从点1出来花费 ...

  7. HDU 4738 Caocao‘s Bridges(桥、任何位运算一定都要加括号、因为有重边所以用前向星)

    HDU 4738 Caocao's Bridges(桥.任何位运算一定都要加括号.因为有重边所以用前向星) Caocao was defeated by Zhuge Liang and Zhou Yu ...

  8. ACM学习历程—HDU 2112 HDU Today(map spfa 优先队列)

    Description 经过锦囊相助,海东集团终于度过了危机,从此,HDU的发展就一直顺风顺水,到了2050年,集团已经相当规模了,据说进入了钱江肉丝经济开发区500强.这时候,XHD夫妇也退居了二线 ...

  9. HDU 6386 Age of Moyu DFS+BFS

    /** HDU 6386 Age of Moyu DFS+BFS 链接:http://acm.hdu.edu.cn/showproblem.php?pid=6386题意:1-->n的最小换乘次数 ...

最新文章

  1. vue.js学习笔记(1)
  2. 02-maven常用命令,以及使用命令创建目录
  3. JS 总结之函数、作用域链
  4. 多人开发时Git下冲突的产生和解决
  5. vue 数组中嵌套数组_vue+element-ui表单校验之数组多层嵌套
  6. php可选缓存APC
  7. maven简单工具命令
  8. 激活策略 查询_苹果手机未激活也可能不是原装货,激活过的手机到底能不能买?...
  9. hive如何确定map数量和reduce数量?
  10. bootstrap 4 自动水平居中
  11. 人人开源需要的问题与解决方案(一)——公网访问、内网穿透
  12. 网络可视化工具netron详细安装流程
  13. 《三国空城计》何为真知己真智慧
  14. 如何压缩jpg图片大小
  15. 用c语言对文件进行加密
  16. WARNING: One of the plugins you are using supports Java 8 language features. To try the support buil
  17. 使学习效率提高5倍的20个起始步骤
  18. 百度cdn深度优化配置
  19. 惜时间_珍惜时间作文合集10篇
  20. 解决 strict-origin-when-cross-origin 问题

热门文章

  1. 互联网上的“罪恶之城”:40多国联合行动才端掉它
  2. 在delphi中引用第三方控件时,找不到dcu的解决办法
  3. 2021年中国1,4-丁二醇(BDO)市场供需分析,“限塑令”背景需求与价格持续提升「图」
  4. vue引入阿里iconfont
  5. Material UI 的安装与使用
  6. 统计—thinkstat英语学习
  7. W公司对接奥迪Audi EDI项目案例
  8. 一张图看懂原生app和H5的区别
  9. BurpSuite调用JavaScript处理Payload,通过JS完全自定义处理逻辑
  10. 2017计算机基础教学大纲,2017级大学计算机基础教学大纲.docx