#include <iostream>
#include <cstring>
#include <algorithm>
#include <queue>
using namespace std;
int n , m;
const int N = 1000010;
int d[N];
int h[N] , ne[N], e[N], idx;
queue<int> q;
int bfs(int start, int end)
{
memset(d, -1, sizeof d);
q.push(start);
d[start] = 0 ;
while(q.size())
{
int t = q.front();
q.pop();
for(int i = h[t]; i != -1; i = ne[i])
{
int j = e[i];
if(d[j]==-1)
{
d[j] = d[t]+1;
q.push(j);
}
}
}
return d[end];
}
void add(int a, int b)
{
e[idx] = b, ne[idx] = h[a], h[a] = idx++;
}
int main()
{
cin >> n >> m;
//n是点的个数, 可以是1 4 7那么就是3个点
//m 是有向图的指向的个数
memset(h, -1, sizeof h);
for (int i = 0; i < m; i ++ )
{
int a, b;
cin >> a >> b;
add(a, b);
}
// 请你输入要查询的开始,和结束;
int start, end;
cin >> start >> end;
cout << bfs(start, end) << endl;
}
只有17分:(孩子想不出来了)
部分样例超时了
#include <iostream>
#include <cstring>
#include <algorithm>
#include <queue>
#pragma GCC optimize(2)
using namespace std;
int n , m, k;
const int N = 1000010;
int d[N];
int id;
int h[N] , ne[N], e[N], idx;
queue<int> q;
int bfs(int start, int end)
{
memset(d, -1, sizeof d);
q.push(start);
d[start] = 0 ;
while(q.size())
{
int t = q.front();
q.pop();
for(int i = h[t]; i != -1; i = ne[i])
{
int j = e[i];
if(d[j]==-1)
{
d[j] = d[t]+1;
q.push(j);
}
}
}
return d[end];
}
void add(int a, int b)
{
e[idx] = b, ne[idx] = h[a], h[a] = idx++;
}
int main()
{
cin >> n >> m >> k;
//n是点的个数, 可以是1 4 7那么就是3个点
//m 是有向图的指向的个数
memset(h, -1, sizeof h);
for (int i = 0; i < m; i ++ )
{
int a, b;
cin >> a >> b;
add(a, b);
add(b, a);
}
// 请你输入要查询的开始,和结束;
while(k--)
{
int start;
cin >> start;
int res = 0 , maxn = -110;
for(int end = 1; end <= n ; end ++ )
{
res = bfs(start, end);
{
if(res > maxn)
{
maxn = res;
if(maxn != 0)
id = end;
if(maxn==0)
id = 0;
}
}
}
cout << id << endl;
}
}