zoukankan      html  css  js  c++  java
  • hdu4460 Friend Chains(记忆化广度优先搜索)

    题意:

    任意两点间最短路中的最长距离。

    思路:

    BFS遍历每个点能到达的最远距离。

    Tips:

    vector的clear要与resize联用。

    #include <bits/stdc++.h>
    using namespace std;
    
    const int M=1100;
    
    int n,m;
    vector<vector<int>> v;
    
    int BFS(int s){
        vector<vector<int>> d(M);
        bool vis[M]={0};
        d[0].push_back(s);
        vis[s]=true;
        int ret=0,cnt=1;
        for(int i=0;i<n;i++){//遍历所有可能的距离
            for(int j:d[i]){//遍历该距离中的点
                for(int k:v[j]){//遍历该距离中的点能到达的点
                    if(!vis[k]){//若不处于之前任一距离中
                        d[i+1].push_back(k);//当前距离+1即为该点的最短距离
                        vis[k]=true;
                        ++cnt;
                    }
                }
            }
            if(d[i].size()) ret=i;//更新能到达的最远距离
        }
        return cnt==n?ret:M;//若不能从该点出发到达所有点,返回M以输出-1
    }
    
    int main(){
        while(cin>>n&&n){
            v.clear();//清空一切,不会保留原大小
            v.resize(M);
    
            map<string,int> mp;
            for(int i=0;i<n;i++){
                string s;cin>>s;
                mp[s]=i;
            }
            cin>>m;
            for(int i=0;i<m;i++){
                string a,b;cin>>a>>b;
                v[mp[a]].push_back(mp[b]);
                v[mp[b]].push_back(mp[a]);
            }
            int k=0;
            for(int i=0;i<n;i++) k=max(k,BFS(i));//遍历以每个点为起点能到达的最远距离
            if(k==M) cout<<"-1
    ";
            else cout<<k<<endl;
        }
    
        return 0;
    }
  • 相关阅读:
    PetaLinux 生成 Zynq 操作系统
    单片机、微控制器和微处理器有什么区别
    嵌入式基础概念系列(1) —— GPIO
    学中杂记
    Spring学习笔记
    jdbc一点小笔记
    JSP学习
    Servlet学习的一些笔记
    接触Struts2的ModelDriven<>接口
    android-dialog的位置
  • 原文地址:https://www.cnblogs.com/Kanoon/p/12462704.html
Copyright © 2011-2022 走看看