Codeforces Round #625 (Div. 1, based on Technocup 2020 Final Round)B(反向建图,BFS最短路)

反向建图,边权为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 }

猜你喜欢

转载自www.cnblogs.com/ldudxy/p/12394583.html