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;
}
原文地址:https://www.cnblogs.com/Kanoon/p/12462704.html