反向建图,边权为1,bfs跑最短路,记录分叉个数。
1 #define HAVE_STRUCT_TIMESPEC 2 #include<bits/stdc++.h> 3 using namespace std; 4 int a[200007]; 5 int dis[200007]; 6 int vis[200007]; 7 struct node{ 8 int v,next_; 9 }e[200007]; 10 int cnt=0; 11 int last[200007]; 12 void add_edge(int x,int y){ 13 e[++cnt].v=y; 14 e[cnt].next_=last[x]; 15 last[x]=cnt; 16 } 17 int num[200007]; 18 void bfs(int x){ 19 dis[x]=1; 20 num[x]=1; 21 queue<int>q; 22 q.push(x); 23 while(!q.empty()){ 24 int u=q.front(); 25 q.pop(); 26 for(int i=last[u];i;i=e[i].next_){ 27 int v=e[i].v; 28 if(dis[v]==0){ 29 q.push(v); 30 dis[v]=dis[u]+1; 31 } 32 if(dis[v]==dis[u]+1) 33 ++num[v];//分叉个数 34 } 35 } 36 } 37 int mn=0,mx=0; 38 int main(){ 39 ios::sync_with_stdio(false); 40 cin.tie(NULL); 41 cout.tie(NULL); 42 int n,m; 43 cin>>n>>m; 44 for(int i=1;i<=m;++i){ 45 int x,y; 46 cin>>x>>y; 47 add_edge(y,x); 48 } 49 int k; 50 cin>>k; 51 for(int i=1;i<=k;++i) 52 cin>>a[i]; 53 bfs(a[k]); 54 for(int i=2;i<=k;++i){ 55 if(dis[a[i-1]]!=dis[a[i]]+1){//不是最短路,一定可以分叉 56 ++mx; 57 ++mn; 58 } 59 else if(num[a[i-1]]>1)//当前结点有多个分叉可选,只影响最大值 60 ++mx; 61 } 62 cout<<mn<<" "<<mx; 63 return 0; 64 }