总结
这题的我自己总结来,就是话贼多,我这种语文水平不好,英语能力又极差的人,当时读偏题了,想了好久,越想越不对,后面问清题意后,就好做多了,多错题意害死人。
解析
就是判断两点间可否满足min or max
min:满足条件不计数:dis[u]=1+dis[v]
max:满足条件不计数:dis[u]=1+dis[v],且u的其他所有相邻结点存在到t的距离+1 == dis[u]
题目链接
/*
____________ ______________ __
/ _________ /\ /_____ _____/\ / /\
/ /\ / / \\ / /\ \ \ / / \
/ / \_____/ / / \__/ / \____\/ / / /
/ / / / / / / / / / / /
/ / / / / / / / / / / /
/ / / / / / / / / / / /
/ /___/____/ / / / / / / /___/________
/____________/ / /__/ / /______________/\
\ \ / \ \ / \ \ \
\____________\/ \__\/ \______________\/
___ ___ ___ __________
/ /\ / /\ / /\ /_______ /\
/ /__\___/ / \ / / \ \ / / \
/____ ____/ / / / / \____/ / /
\ / /\ \ / / / / / / /
\_/ / \___\/ ___ / / / / / /
/ / / / /\ / / / / / /
/ / / / /__\__/ / / / /___/____
/___/ / /___________/ / /___________/\
\ \ / \ \ / \ \ \
\___\/ \___________\/ \___________\/
A CODE OF CBOY
*/
#include<bits/stdc++.h>
//typedef long long ll;
//#define ull unsigned long long
//#define int long long
#define F first
#define S second
#define endl "\n"//<<flush
#define eps 1e-6
#define lowbit(x) (x&(-x))
#define PI acos(-1.0)
#define inf 0x3f3f3f3f
#define MAXN 0x7fffffff
#define INF 0x3f3f3f3f3f3f3f3f
#define pa pair<int,int>
#define ferma(a,b) pow(a,b-2)
#define pb push_back
#define all(x) x.begin(),x.end()
#define memset(a,b) memset(a,b,sizeof(a));
#define IOS ios::sync_with_stdio(false),cin.tie(0),cout.tie(0);
using namespace std;
void file()
{
#ifdef ONLINE_JUDGE
#else
freopen("cin.txt","r",stdin);
// freopen("cout.txt","w",stdout);
#endif
}
const int N=2e5+5;
vector<int>G[N],GT[N];
int vis[N],dis[N];
void bfs(int x)
{
queue<int>que;
que.push(x);
vis[x]=true;
while(!que.empty())
{
int pos=que.front();
que.pop();
for(auto it:G[pos])
{
if(vis[it])
continue;
vis[it]=true;
que.push(it);
dis[it]=dis[pos]+1;
}
}
}
signed main()
{
IOS;
//file();
int n,m;
cin>>n>>m;
while(m--)
{
int x,y;
cin>>x>>y;
GT[x].pb(y);
G[y].pb(x);
}
int k;
cin>>k;
vector<int>vec(k),ans(2);
for(auto &it:vec)
cin>>it;
bfs(vec[k-1]);
for(int i=0;i<k-1;i++)
{
vector<int>flag(2);
int v=vec[i];
for(auto u:GT[v])
{
if(1+dis[u]==dis[v]&&u==vec[i+1])
flag[0]++;
if(1+dis[u]==dis[v]&&u!=vec[i+1])
flag[1]++;
}
ans[0]+=(flag[0]?0:1);
ans[1]+=(flag[0]&&flag[1]==0?0:1);
}
cout<<ans[0]<<" "<<ans[1]<<endl;
return 0;
}