zoukankan      html  css  js  c++  java
  • small test on 5.30 night T2

    (题面写错了,应该是一条从b -> a 的边)

        让我们设状态 (a,b,c) 表示存在一个点k,使得  dist(k,b) - dist(k,a) * 2 + 3 = c,显然这里的第三维可以压成0~2,因为每次a走出去一步,b就要多走出去两步,可以证明a和b交替走是不会影响最后的答案的,所以直接一遍BFS出所有状态,然后答案就是 形如(a,b,0) 的状态个数。

    #include<iostream>
    #include<cstdio>
    #include<queue>
    #define ll long long
    using namespace std;
    const int maxn=3005;
    int n,m,hd[maxn],ne[maxn],to[maxn],num,ans,N[3]={1,2,0};
    bool v[maxn][maxn][3];
    
    struct node{ int a,b,c;};
    queue<node> q;
    
    inline void add(int x,int y){ to[++num]=y,ne[num]=hd[x],hd[x]=num;}
    
    inline void solve(){
    	for(int i=1;i<=n;i++) v[i][i][0]=1,q.push((node){i,i,0});
    	
    	node x;
    	while(!q.empty()){
    		x=q.front(),q.pop();
    		
    		if(x.c){
    			for(int i=hd[x.b];i;i=ne[i]) if(!v[x.a][to[i]][N[x.c]]){
    				v[x.a][to[i]][N[x.c]]=1;
    				q.push((node){x.a,to[i],N[x.c]});
    			}
    		}
    		else{
    			ans++;
    			for(int i=hd[x.a];i;i=ne[i]) if(!v[to[i]][x.b][1]){
    				v[to[i]][x.b][1]=1;
    				q.push((node){to[i],x.b,1});
    			}
    		}
    	}
    }
    
    int main(){
    //	freopen("dierti.in","r",stdin);
    //	freopen("dierti.out","w",stdout);
    	
    	scanf("%d%d",&n,&m);
        int uu,vv;
    	for(int i=1;i<=m;i++) scanf("%d%d",&uu,&vv),add(vv,uu);
    	
    	solve();
    	
    	printf("%d
    ",ans);
    	return 0;
    }
    

      

      

  • 相关阅读:
    ansible
    celery 计划任务使用
    11 session 使用
    10 模版继承和页面之间的调用
    9 模版语言 jinja2
    8 公共函数
    7 文件上传
    6 获取请求头和URL信息
    5 获取Form表单取值
    4 文件操作 支持图片 视频 mp3 文本等
  • 原文地址:https://www.cnblogs.com/JYYHH/p/9113708.html
Copyright © 2011-2022 走看看