题意:

连续相同类型的边花费为1,走不同的边花费加一,求最少花费

BFS:维护当前最少花费,每次往外扩展一步即可

最短路:set记录到达改点的边的类型都有哪些(距离相同),如果出现更小的则清空,否则若相同,加入集合。 在进行距离更新时判断一下set里有没有当前类型的边即可

BFS

#include <bits/stdc++.h>using namespace std;const int maxn = 1e5 + 10;;
const int INF = 0x3f3f3f3f;
int n,m;
int head[maxn],tot;
queue<int> que;
int dis[maxn];
bool vis[maxn];
struct Edge
{int to,id,next;bool vis;
} E[maxn*4];inline void add(int from,int to,int id)
{E[++tot].next = head[from];E[tot].to = to;E[tot].id = id;E[tot].vis = 0;head[from] = tot;E[++tot].next = head[to];E[tot].id = id;E[tot].to = from;E[tot].vis = 0;head[to] = tot;
}
inline void init()
{tot = 0;memset(head,0,sizeof head);
}
void dfs(int x,int id,int num)
{if(!vis[x]){dis[x] = num;vis[x] = true;if(x == n)return;que.push(x);}for(int i=head[x] ; i ; i=E[i].next){if(E[i].vis)continue;if(E[i].id == id){E[i].vis = true;dfs(E[i].to,id,num);}}
}
void bfs()
{while(!que.empty())que.pop();memset(vis,false,sizeof vis);dis[1] = 0;dis[n] = -1;vis[1] = true;que.push(1);while(!que.empty()){int t = que.front();que.pop();for(int i=head[t] ; i ; i=E[i].next){if(E[i].vis)continue;E[i].vis = true;dfs(E[i].to,E[i].id,dis[t]+1);if(dis[n] > 0)break;}if(dis[n] > 0)break;}
}int main()
{while(scanf("%d %d",&n,&m) == 2){init();if(m == 0){printf("-1\n");continue;}int a,b,c;for(int i=1 ; i<=m ; ++i){scanf("%d %d %d",&a,&b,&c);add(a,b,c);}bfs();printf("%d\n",dis[n]);}return 0;
}

最短路:

#include <cstdio>
#include <cstring>
#include <queue>
#include <set>
using namespace std;
#define INF 0x3f3f3f3f
struct edge{int to;int id;int next;
}a[400020];
int head[200020];
int n,m,q;
int vis[200020];struct nodope{int val;      set<int> d;
}d[200020];     inline 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){int to=a[i].to;if(d[to].val>(d[u].val+(d[u].d.find(a[i].id)==d[u].d.end()))){d[to].val=d[u].val+(d[u].d.find(a[i].id)==d[u].d.end());d[to].d.clear();d[to].d.insert(a[i].id);if(!vis[to]){q.push(to);vis[to]=1;}}else if(d[to].val==d[u].val&&d[to].d.find(a[i].id)==d[to].d.end()){d[to].d.insert(a[i].id);if(!vis[to]){q.push(to);vis[to]=1;}}}}if(d[n].val!=INF)printf("%d\n",d[n].val);else printf("-1\n");return 0;
}
int nn;
inline void add(int x,int y,int z)
{a[nn].id=z;   a[nn].to=y;a[nn].next=head[x];head[x]=nn++;a[nn].id=z;    a[nn].to=x;a[nn].next=head[y];head[y]=nn++;
}
int main()
{while(~scanf("%d%d",&n,&m)){for(int i=0;i<=n;i++)head[i]=-1;nn=0;for(int i=0;i<m;i++){int x,y,z;scanf("%d%d%d",&x,&y,&z);add(x,y,z);}spfa();}return 0;
}

HDU - 6386 - Age of Moyu (BFS分层+DFS 或者 最短路+set)相关推荐

  1. 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的最小换乘次数 ...

  2. HDU 6386 Age of Moyu 2018 Multi-University Training Contest 7(最短路径dijkstra)

    Age of Moyu 题意:第一行给出n,m,接下来有m条路,每一行给出 a b c ,从a到b 是c掌控. 若下一条路与上一条路不属于一个c,需要缴费1. 输出从1到N的最小花费,不通则输出-1 ...

  3. HDU 6386 Age of Moyu

    题目:Age of Moyu 思路:裸的堆优化dijkstra 代码: #include<bits/stdc++.h> using namespace std;#define maxn 2 ...

  4. HDU 6386 Age of Moyu(搜索)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6386 题意:n个点,m条边,每条边有权值,双向边.你要从1走到n,若路径上的权值一样,则只用花费1即可 ...

  5. hdu 6386 Age of Moyu (重边判断)

    本来用一个map判重边结果T了, 实际上可以直接给边上打标记即可 int n, m; struct _ {int to,w,vis;}; vector<_> g[N]; int dis[N ...

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

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

  7. HDU - 6386 Age of Moyu

    Mr.Quin love fishes so much and Mr.Quin's city has a nautical system,consisiting ofNN ports and MM s ...

  8. 2018 Multi-University Training Contest 7----hdu 6386 Age of Moyu(Dijkstra)

    点击链接 题意:给你一些路径,每次换路径的id时加收一块,求到终点所需的最少钱 思路:用Dijkstra跑一遍所有路径,从某条边到另一条边如果遇到不同的路径的时候cost+1,遇到相同的保留该cost ...

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

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

最新文章

  1. HDU4658 Integer Partition(整数拆分+判断相同数)
  2. .Oracle管理及常用基础脚本
  3. 工作341:uni-表头不显示
  4. CSS基础学习-13.CSS 浮动
  5. Java中单例模式—饿汉式和懒汉式
  6. 循序渐进之Spring AOP(2) - 基本概念
  7. 谈谈我心目中理想的牛人
  8. 用友U8远程接入解决方案用户手册下载
  9. qt TCP 网络编程
  10. IR2130与MOSFET驱动电路分析
  11. 实现Codeblock支持C99标准
  12. P,NP,NPC,NP-HARD 图片基于P!=NP
  13. 关于解决百度网盘盘符无法删除的问题
  14. C++ 侯捷视频学习(草稿)
  15. 全局序列比对 c语言实现,序列比对(一)——全局比对Needleman-Wunsch算法
  16. 2017年博客第一篇随笔
  17. webstrom 2099年设置
  18. gt2e鸿蒙系统,华为Watch GT2e评测:轻松开启年轻人一手掌控的百变运动潮酷生活...
  19. 钽电容一般用于电源输出端滤波
  20. 人工智能技术会代替人类的工作吗

热门文章

  1. The free SSH client for Android 之JuiceSSH神器
  2. html极坐标,用Desmos玩极坐标
  3. 一位英语老师写给老婆的情书
  4. POJ - 1129
  5. Random的nextInt()用法
  6. Linux cp 递归复制所有文件和文件夹
  7. mysql keep alive_mysql+keepalive 高可用
  8. python 字符串切片
  9. iOS12 SKStoreViewController crash修复
  10. CSDN 永远的神.gif