zoukankan      html  css  js  c++  java
  • [题解]CF1321D Navigation System

    思路:从终点反向bfs,求出每个点到终点的距离

    然后枚举原图的每一条边,计算出度

    最后对于路径上每个点判断即可

    code

    
    #include<bits/stdc++.h>
    namespace my_std
    {
    	using namespace std;
    	#define rep(i,a,b) for (int i=(a);i<=(b);i++)
    	#define drep(i,a,b) for (int i=(a);i>=(b);i--)
    	#define go(u) for (int i=head[(u)];i;i=e[i].nxt)
    	#define pf printf
    	#define writeln(x) write(x),putchar('
    ')
    	#define writesp(x) write(x),putchar(' ')
    	#define mem(x,v) memset(x,v,sizeof(x))
    	typedef long long ll;
    	const int INF=0x7fffffff;
    	inline int read()
    	{
    		int sum=0,f=1;
    		char c=0;
    		while (!isdigit(c))
    		{
    			if (c=='-') f=-1;
    			c=getchar();
    		}
    		while (isdigit(c))
    		{
    			sum=(sum<<1)+(sum<<3)+(c^48);
    			c=getchar();
    		}
    		return sum*f;
    	}
    	void write(int k)
    	{
    		if (k<0) putchar('-'),k=-k;
    		if (k>=10) write(k/10);
    		putchar(k%10+'0');
    	}
    }
    using namespace my_std;
    const int N=200010;
    int n,m,head[N],HEAD[N];
    int s,t,cnt1,cnt2;
    int dis[N],p[N],out[N];
    int maxx=0,minn=0;
    struct edge
    {
    	int to,nxt;
    }e[N<<1],E[N<<1];
    void add1(int u,int v)
    {
    	e[++cnt1].to=v;
    	e[cnt1].nxt=head[u];
    	head[u]=cnt1;
    }
    void add2(int u,int v)
    {
    	E[++cnt2].to=v;
    	E[cnt2].nxt=HEAD[u];
    	HEAD[u]=cnt2;
    }
    void bfs(int f)
    {
    	queue<int>q;
    	dis[f]=1;
    	q.push(f);
    	while (!q.empty())
    	{
    		int u=q.front();
    		for (int i=HEAD[u];i;i=E[i].nxt)
    		{
    			int v=E[i].to;
    			if (dis[v]==0)
    			{
    				dis[v]=dis[u]+1;
    				q.push(v);
    			}
    		}
    		q.pop();
    	}
    }
    int main()
    {
    	n=read(),m=read();
    	int u,v;
    	rep(i,1,m)
    	{
    		u=read(),v=read();
    		add1(u,v),add2(v,u);
    	}
    	int size=read();
    	rep(i,1,size) p[i]=read();
    	bfs(p[size]);
    	rep(u,1,n) go(u)
    	{
    		int v=e[i].to;
    		if (dis[v]+1==dis[u])
    		{
    			out[u]++;
    		}
    	}
    	rep(i,1,size-1)
    	{
    		if (dis[p[i]]!=dis[p[i+1]]+1) minn++,maxx++;
    		else if (dis[p[i]]==dis[p[i+1]]+1&&out[p[i]]>=2) maxx++;
    	}
    	writesp(minn),writeln(maxx);
    }
    
    
  • 相关阅读:
    git 创建一个空分支
    github page的两种类型
    hexo-theme-next
    github网页
    Linux下的CPU使用率与服务器负载的关系与区别
    mysql数据库优化日志(更)-howyue
    图片延时加载
    jQuery实现页面滚动时顶部动态显示隐藏
    TCP与UDP区别
    记一次网站服务器迁移(my)
  • 原文地址:https://www.cnblogs.com/ZHANG-SHENG-HAO/p/12416714.html
Copyright © 2011-2022 走看看