zoukankan      html  css  js  c++  java
  • Codeforces 1272E Nearest Opposite Parity(BFS)

    思路:

    1.如果从i可到j,我们反过来存储,即ji有一条单向边,存储所有的结点可以形成一张图;
    2.我们用队列进行bfs,初始将所有点都加入;
    3.对于每个点我们维护两个信息,离它最近的奇数多远&&离它最近的偶数多远;
    4.每次遍历队首的那个结点可达到的(注意已经反向存储)点,查看这些点是否需要更新信息,如果需要更新,更新完之后需要重新将该点加入队列;

    代码:

    #include<bits/stdc++.h>
    using namespace std;
    #define pt(a) cerr<<a<<"---
    "
    const int maxn=2e5+99;
    const int INF=1<<30;
    struct node{int v,a,b;}G[maxn];
    vector<int> v[maxn];
    int main(){
    	ios::sync_with_stdio(false);
    	cin.tie(nullptr);
    	int n; cin>>n;
    	for(int i=1;i<=n;++i){
    		G[i].a=G[i].b=INF;
    		cin>>G[i].v;
    		if(i+G[i].v<=n) v[i+G[i].v].push_back(i);
    		if(i-G[i].v>=1) v[i-G[i].v].push_back(i);
    	}
    	queue<int> que;
    	for(int i=1;i<=n;++i) que.push(i);
    	while(!que.empty()){
    		int x=que.front(); que.pop();
    		for(int i:v[x]){
    			if(G[x].v&1){
    				if(G[i].a>1||G[i].b>G[x].b+1){
    					G[i].a=1;
    					if(G[i].b>G[x].b+1) G[i].b=G[x].b+1;
    					que.push(i);
    				}
    			}else{
    				if(G[i].b>1||G[i].a>G[x].a+1){
    					G[i].b=1;
    					if(G[i].a>G[x].a+1) G[i].a=G[x].a+1;
    					que.push(i);
    				}
    			}
    		}
    	}
    	for(int i=1;i<=n;i++){
    		if(G[i].v&1) cout<<(G[i].b==INF?-1:G[i].b)<<' ';
    		else cout<<(G[i].a==INF?-1:G[i].a)<<' ';
    	}
    	return 0;
    }
    
  • 相关阅读:
    Electio Time poj
    排列的字典序问题
    poj 2365
    编程中的命名设计那点事(转)
    编程命名中的7+1个提示(转)
    poj 1664 放苹果——递归
    再论字典序
    poj 3618
    sort用法
    poj 1088
  • 原文地址:https://www.cnblogs.com/yuhan-blog/p/12308750.html
Copyright © 2011-2022 走看看