Codeforces 845G Shortest Path Problem?

http://codeforces.com/problemset/problem/845/G

从顶点1dfs全图,遇到环则增加一种备选方案,环上的环不需要走到前一个环上作为条件,因为走完第二个环可以从第一个环原路返回。
对每种备选方案通过x = min(x,x^v[i]) 保留备选方案中不存在的最高位,如果能由已经存在的备选方案组合得到则结果为零
最后对val[n]做一次类似的操作得到答案
#include<bits/stdc++.h>
using namespace std;
const int maxn = 100100;
vector<int> v;
struct EDGE{
    int to,next,len;
    EDGE(){
    }
    EDGE(int a,int b,int c){
        to = a,next = b,len = c;
    }
}e[maxn<<1];
int vis[maxn],st,ed,cnt,head[maxn],val[maxn],len;
void add(int u,int v,int len){
    e[++cnt] = EDGE(v,head[u],len);
    head[u] = cnt;
}
void add(int x){
    for(int i = 0;i<(int)v.size();i++){
        x = min(x,x^v[i]);
    }
    if(x) v.push_back(x);
}
void dfs(int x,int now){
    vis[x] = 1;
    for(int i = head[x];i;i = e[i].next){
        int to = e[i].to;
        if(vis[to]) add(val[to]^now^e[i].len);
        else{
            val[to] = now^e[i].len;
            dfs(to,val[to]);
        } 
    }
}
int main(){
    int n,m;
    scanf("%d%d",&n,&m);
    for(int i = 0;i<m;i++){
        scanf("%d%d%d",&st,&ed,&len);
        add(st,ed,len);
        add(ed,st,len);
    }
    dfs(1,0);
    for(int i = 0;(int)i<v.size();i++){
        val[n] = min(val[n],val[n]^v[i]);
    }
    return 0*printf("%d",val[n]);
}

 8/28更新

https://csacademy.com/contest/archive/task/xor_cycle

一道类似的题,同样是找出所有环,最后组合出最大结果输出即可

#include<iostream>
#include<cstdio>
#include<vector>
using namespace std;
int n,m;
vector<pair<int,long long> > node[100010];
int vis[100010],a,b;
long long val[100010];
long long _len;
vector<long long> base;
void add(long long x){
    for(int i = 0;i<base.size();i++){
        x = min(x,x^base[i]);
    }
    if(x) base.push_back(x);
}
void dfs(int x,int fa){
    for(int i = 0;i<node[x].size();i++){
        int to = node[x][i].first;
        long long len = node[x][i].second;
        if(to == fa) continue;
        if(!vis[to]){
            vis[to] = 1;
            val[to] = val[x]^len;
            dfs(to,x);
        }
        else{
            add(val[to]^len^val[x]);
        }
    }
}
int main(){
    ios::sync_with_stdio(false);
    cin.tie(0);
    cin>>n>>m;
    for(int i = 0;i<m;i++){
        cin>>a>>b>>_len;
        node[a].push_back(make_pair(b,(long long)_len));
        node[b].push_back(make_pair(a,(long long)_len));
    }
    dfs(1,-1);
    long long ans = 0;
    for(int i = 0;i<base.size();i++){
        ans = max(ans,ans^base[i]);
    }
    cout<<ans<<endl;
    return 0;
}

 

 

posted @ 2017-08-23 23:37  Invisible_full_moon  阅读(526)  评论(0)    收藏  举报