bfs理解——hdu6386好题
2024-09-05 04:14:42
用队列维护,对于每块颜色相同的相连的边进行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";
}
}
最新文章
- Java语法糖3:泛型
- Quartz Spring与Spring Task总结
- Activating Browser Modes with Doctype
- python 学习笔记3(循环方式;list初始化;循环对象/生成器/表推导;函数对象;异常处理)
- ECC校验优化之路
- Objective-C语法简记学习
- JS页面打开方式丶对话框及页面跳转方式
- NGUI 解决UILable 在空行起始位置加‘\n’
- Java集合框架(三)—— List、ArrayList、Vector、Stack
- delphi 给EXE文件增加区段
- Android的四个基本概念(线程通信和GLSurfaceView)
- background-size cover和contain的用法详解
- Java爬取网络博客文章
- MSCKF_VIO:MSCKF的双目版本
- 20165321 实验一Java开发环境的熟悉-2
- asyncio queue
- Oracle 12C -- Plug in a Non-CDB as a PDB
- SpringMVC源码阅读:Json,Xml自动转换
- Algorithm——Add Two Numbers(补上周)
- android源码如何起步与阅读方法