7-14 喊山
思路
这题就是一道裸的dijkstra,但是一定要注意是能传到的其他点的最大值,如果只能传到自己,这时候应该返回一个0。
代码
#include <bits/stdc++.h>
using namespace std;
const int maxn=1e4+10;
const int INF=0x3f3f3f3f;
vector<int> g[maxn];
int d[maxn],vis[maxn];
struct Node {
int id;
int dis;
Node(int i,int d) :id(i),dis(d) {}
bool operator < (const Node& a) const {
return dis>a.dis;
}
};
int dijkstra(int s) {
memset(vis,0,sizeof(vis));
memset(d,INF,sizeof(d));
d[s]=0;
priority_queue<Node> pq;
pq.push(Node(s,0));
int res=1;
int id=INF;
while (!pq.empty()) {
Node f=pq.top();
pq.pop();
if (vis[f.id]) {
continue;
}
if (f.dis>res) {
res=f.dis;
id=f.id;
}
else if (f.dis==res&&f.id<id) {
id=f.id;
}
vis[f.id]=1;
for (auto next:g[f.id]) {
if (!vis[next]&&f.dis+1<d[next]) {
d[next]=f.dis+1;
pq.push(Node(next,d[next]));
}
}
}
return id==INF?0:id;
}
int main()
{
int n,m,k;
int v1,v2;
scanf("%d%d%d",&n,&m,&k);
while (m--) {
scanf("%d%d",&v1,&v2);
g[v1].push_back(v2);
g[v2].push_back(v1);
}
while (k--) {
scanf("%d",&v1);
printf("%d\n",dijkstra(v1));
}
return 0;
}