用队列维护,对于每块颜色相同的相连的边进行dfs并记录即可

注意这题要用vis来标记边,不可以标记点

因为点的深度是可以随时更新的(这样的做法不满足贪心条件)

#include<bits/stdc++.h>
using namespace std;
#define maxn 200005
#define INF 0x3f3f3f3f
struct Edge{
int to,nxt,w,flag;
}edge[maxn<<];
int head[maxn],tot,n,m;
void init(){memset(head,-,sizeof head);tot=;}
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=;
} 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!=-;i=edge[i].nxt){
if(edge[i].flag)continue;
if(edge[i].w==c){
edge[i].flag=;
dfs(edge[i].to,c,deep);
}
}
}
void bfs(){
while(q.size())q.pop();
memset(d,0x3f,sizeof d);
q.push();
d[]=;
while(q.size()){
int u=q.front();q.pop();
for(int i=head[u];i!=-;i=edge[i].nxt){
if(edge[i].flag)continue;
int v=edge[i].to;
edge[i].flag=;
dfs(v,edge[i].w,d[u]+);
}
}
} int main(){
while(cin>>n>>m){
memset(edge,,sizeof edge);
init();
for(int i=;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";
}
}

最新文章

  1. Java语法糖3:泛型
  2. Quartz Spring与Spring Task总结
  3. Activating Browser Modes with Doctype
  4. python 学习笔记3(循环方式;list初始化;循环对象/生成器/表推导;函数对象;异常处理)
  5. ECC校验优化之路
  6. Objective-C语法简记学习
  7. JS页面打开方式丶对话框及页面跳转方式
  8. NGUI 解决UILable 在空行起始位置加‘\n’
  9. Java集合框架(三)—— List、ArrayList、Vector、Stack
  10. delphi 给EXE文件增加区段
  11. Android的四个基本概念(线程通信和GLSurfaceView)
  12. background-size cover和contain的用法详解
  13. Java爬取网络博客文章
  14. MSCKF_VIO:MSCKF的双目版本
  15. 20165321 实验一Java开发环境的熟悉-2
  16. asyncio queue
  17. Oracle 12C -- Plug in a Non-CDB as a PDB
  18. SpringMVC源码阅读:Json,Xml自动转换
  19. Algorithm——Add Two Numbers(补上周)
  20. android源码如何起步与阅读方法

热门文章

  1. java oop第11章_反射、BaseDao的进一步改造
  2. MySQL 小调研
  3. 网络编程之 TCP-UDP的详细介绍
  4. margin与padding
  5. WindowsPowerShell常用命令
  6. Kafka命令行操作
  7. CSS3:目录
  8. 得益于AI,这五个行业岗位需求将呈现显著增长趋势
  9. Day 13 : 函数递归,
  10. shell 一些命令(转)