bfs理解——hdu6386好题
Posted zsben991126
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了bfs理解——hdu6386好题相关的知识,希望对你有一定的参考价值。
用队列维护,对于每块颜色相同的相连的边进行dfs并记录即可
注意这题要用vis来标记边,不可以标记点
因为点的深度是可以随时更新的(这样的做法不满足贪心条件)
#include<bits/stdc++.h> using namespace std; #define maxn 200005 #define INF 0x3f3f3f3f struct Edge int to,nxt,w,flag; edge[maxn<<1]; int head[maxn],tot,n,m; void init()memset(head,-1,sizeof head);tot=0; void add(int u,int v,int w) edge[tot].to=v;edge[tot].w=w;edge[tot].nxt=head[u];head[u]=tot++; edge[tot].flag=0; queue<int>q; int d[maxn]; void dfs(int u,int c,int deep) if(d[u]>deep) d[u]=deep; q.push(u); for(int i=head[u];i!=-1;i=edge[i].nxt) if(edge[i].flag)continue; if(edge[i].w==c) edge[i].flag=1; dfs(edge[i].to,c,deep); void bfs() while(q.size())q.pop(); memset(d,0x3f,sizeof d); q.push(1); d[1]=0; while(q.size()) int u=q.front();q.pop(); for(int i=head[u];i!=-1;i=edge[i].nxt) if(edge[i].flag)continue; int v=edge[i].to; edge[i].flag=1; dfs(v,edge[i].w,d[u]+1); int main() while(cin>>n>>m) memset(edge,0,sizeof edge); init(); for(int i=1;i<=m;i++) int u,v,w; scanf("%d%d%d",&u,&v,&w); add(u,v,w);add(v,u,w); bfs(); if(d[n]==INF)puts("-1"); else cout<<d[n]<<"\n";
以上是关于bfs理解——hdu6386好题的主要内容,如果未能解决你的问题,请参考以下文章
HDU - 6386 Age of Moyu 2018 Multi-University Training Contest 7 (Dijkstra变型)
[最短路] aw920. 最优乘车(单源最短路建图+bfs最短路模型+知识理解+好题)
[bfs] aw175. 电路维修(双端队列广搜+dijkstra理解+好题+难题)
[Hbfs] lc815. 公交路线(建图+多源bfs+bfs最短路+思维+好题)