标记一下
输入样例:
7 5 4
1 2
2 3
3 1
4 5
5 6
1 4 5 7
输出样例:
2
6
4
0
我是不是傻逼我是不是智障我他妈想都没想上了个floyd.啊啊啊我无可救药
n(≤10000)k(≤10)
查询次数这么少,值得我为他写floyd,n=1e4,我是真的有病有病。
直接dijkstra。dijkstra时找到最远的点,因为是建立在每个点最路短的基础上的。
#include <cstdio>
#include <cstring>
#include <queue>
#define m(a,b) memset(a,b,sizeof a)
using namespace std;
typedef long long ll;
const int N=10000+5,M=N*N/2,INF=0x3f3f3f3f;
int head[N],d[N],tot;
struct Edge{int to,len,nex;}edge[M];
void add(int from,int to,int len)
{
edge[++tot]=(Edge){to,len,head[from]};head[from]=tot;
edge[++tot]=(Edge){from,len,head[to]};head[to]=tot;
}
priority_queue<pair<int,int> >q;
int dijkstra(int s)
{
int res=0,dex=0;
m(d,INF);
q.push(make_pair(0,s));
d[s]=0;
while(!q.empty())
{
int x=q.top().second;q.pop();
if(res<d[x])
res=d[x],dex=x;
else if(res==d[x]&&x<dex)
dex=x;
for(int i=head[x];i;i=edge[i].nex)
{
int y=edge[i].to,l=edge[i].len;
if(d[y]>d[x]+l)
{
d[y]=d[x]+l;
q.push(make_pair(-d[y],y));
}
}
}
return dex;
}
int main()
{
int n,m,q;
scanf("%d%d%d",&n,&m,&q);
while(m--)
{
int from,to;
scanf("%d%d",&from,&to);
add(from,to,1);
}
while(q--)
{
int x;scanf("%d",&x);
printf("%d\n",dijkstra(x));
}
}