团体程序设计天梯赛(L3-008 喊山 (30 分))

题目:

思路分析:

读懂题目就是一个求最短dijsktra+最长路的模型 

代码实现:

/*
*@Author:   GuoJinlong
*@Language: C++
*/
//#include <bits/stdc++.h>
/*
 *                                                     __----~~~~~~~~~~~------___
 *                                    .  .   ~~//====......          __--~ ~~
 *                    -.            \_|//     |||\\  ~~~~~~::::... /~
 *                 ___-==_       _-~o~  \/    |||  \\            _/~~-
 *         __---~~~.==~||\=_    -_--~/_-~|-   |\\   \\        _/~
 *     _-~~     .=~    |  \\-_    '-~7  /-   /  ||    \      /
 *   .~       .~       |   \\ -_    /  /-   /   ||      \   /
 *  /  ____  /         |     \\ ~-_/  /|- _/   .||       \ /
 *  |~~    ~~|--~~~~--_ \     ~==-/   | \~--===~~        .\
 *           '         ~-|      /|    |-~\~~       __--~~
 *                       |-~~-_/ |    |   ~\_   _-~            /\
 *                            /  \     \__   \/~                \__
 *                        _--~ _/ | .-~~____--~-/                  ~~==.
 *                       ((->/~   '.|||' -_|    ~~-/ ,              . _||
 *                                  -_     ~\      ~~---l__i__i__i--~~_/
 *                                  _-~-__   ~)  \--______________--~~
 *                                //.-~~~-~_--~- |-------~~~~~~~~
 *                                       //.-~~~--\
 *                       ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 *
 *                               神兽保佑            永无BUG
 */


const int MAX=10010;
struct node{
    int to,w;
};
int n,m,k;
vector<node>v[MAX];
int dist[MAX];
int vis[MAX];
typedef pair<int,int> p;
void dij(int s){
    mms(vis,0);
    priority_queue<p,vector<p>,greater<p>>q;
    mms(dist,INF);
    while (!q.empty()) {
        q.pop();
    }
    q.push(p(0,s));
    dist[s]=0;
    
    
    while (!q.empty()) {
        p p1=q.top();
        q.pop();
        int u=p1.second;
        if(vis[u]) continue;
        vis[u]=1;
        for(int i=0;i<v[u].size();i++){
            int ne=v[u][i].to;
            int w=v[u][i].w;
            if(dist[ne]>dist[u]+w&&!vis[ne]){
                dist[ne]=dist[u]+w;
                q.push({dist[ne],ne});
            }
        }
    }
}

int main(){
    cin>>n>>m>>k;
    mms(dist,INF);
    while (m--) {
        int x,y;
        cin>>x>>y;
        v[x].push_back({y,1});
        v[y].push_back({x,1});
    }
    while (k--) {
        int x;
        cin>>x;
        dij(x);
        int pos=0;
        int ans=0;
        for(int i=1;i<=n;i++){
            if(ans<dist[i]&&dist[i]<=n){
                ans=dist[i];
                pos=i;
            }
        }
        cout<<pos<<endl;
    }
}
    

猜你喜欢

转载自blog.csdn.net/m0_57006708/article/details/121236206