团体程序设计天梯赛(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;}
}