• codefoces 1407E Egor in the Republic of Dagestan


    https://codeforces.com/contest/1407/problem/E

    玄学题,有一个重要的事情,反向建边,边指向的点颜色一致,那就从n开始bfs,第一次遇到必定要和边反色,因为不反色的话路就短了。。。(第一次遇到的路一定是最短的)

    具体看代码,写法简单,参考LDK神仙

    #include<iostream>
    #include<cstring>
    #include<queue>
    #include<vector>
    using namespace std;
    typedef long long ll;
    const int maxn = 5e5+111;
    ll dis[maxn];
    ll INF = 1e17;
    
    struct Node{
    	int p,len;
    	Node(int a,int b):p(a),len(b){}
    };
    
    vector<Node>G[maxn];
    
    void add(int x,int y,int len){
    	G[x].push_back(Node(y,len));
    }
    int vis[maxn];
    
    int n,m;
    int bfs(){
    	queue<int>que;
    	que.push(n);
    	dis[n] = 0;	
    	
    	while(que.size()){
    		int x = que.front();
    		que.pop();
    		
    		for(int i=0;i<G[x].size();i++){
    			int p  =G[x][i].p;
    			
    			if(vis[p] == -1){//不标记就被抢先了 
    				vis[p] = G[x][i].len^1;
    			}
    			else{
    				if(G[x][i].len == vis[p]){//送过来 
    					if(dis[p] > dis[x] + 1){
    						dis[p] = dis[x] + 1;
    						que.push(p);
    					}
    				}
    			}
    		}
    	}
    	return 0;
    }
    
    int main(){
    
    	cin>>n>>m;
    	for(int i=0;i<=n;i++){
    		vis[i] = -1;
    		dis[i] = INF;
    	}
    	
    	for(int i=0;i<m;i++){
    		int x,y,len;
    		cin>>x>>y>>len;
    		if(x == y) continue;
    		add(y,x,len);//指向即为颜色 
    	}
    	bfs();
    	if(dis[1] == INF){
    		cout<<-1<<endl;
    	}
    	else{
    		cout<<dis[1]<<endl;
    	}
    	//cout<<dis[1]<<endl;
    	vis[n] = 1;
    	for(int i=1;i<=n;i++){
    		if(vis[i] == -1) vis[i] = 1; 
    		cout<<vis[i];
    	}
    	cout<<endl;
    	return 0;
    }
    

      

    寻找真正的热爱
  • 相关阅读:
    Android 如何在自己的应用中模拟Home键
    ComboBox添加Item
    修复JSCRIPT
    几天没用TFS!挂了!
    简单的上传图片并生成缩略图
    上传图片时中文路径的问题
    获取DataList和Repeater里的控件
    MIME 类型列表
    STL注意
    MFC下的MessageBox使用_附带CBUTTON
  • 原文地址:https://www.cnblogs.com/lesning/p/13676075.html
Copyright © 2020-2023  润新知