zoukankan      html  css  js  c++  java
  • 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]<<"
    ";        
        }    
    }
  • 相关阅读:
    AutoMapper使用
    C#网络编程
    ASP.NET MVC (Razor)开发
    React的React Native
    WCF搭建
    异步编程
    Async和Await进行异步编程
    C#开发中使用配置文件
    NET转Java
    net 开源组件
  • 原文地址:https://www.cnblogs.com/zsben991126/p/10960509.html
Copyright © 2011-2022 走看看