Codeforces 845 G Shortest Path Problem?

来源:互联网 发布:java工程师如何考试 编辑:程序博客网 时间:2024/06/06 00:31

题目地址
题意:给你一个图,求1~n的最短路(但是权重的计算方式变成了异或)
思路:如果没有环的存在的话那就是直接算下去,但是正是因为有环的存在,所以在一些地方可能绕环一周以后的值更小。所以要记录下来,最后判断最小的权重是多少。解释一下为什么要记录的是:add(nums^mapp[u[i].val^num[v]);吧。因为其实num[v]等于原来到v的距离,所以包括了之前的值,但是之前的值在记录中是要去掉的,所以直接以后就把这些值给去掉了,那剩下的应该就是图中画红线的部分了。
这里写图片描述

#include <iostream>#include <cstring>#include <string>#include <queue>#include <vector>#include <map>#include <set>#include <stack>#include <cmath>#include <cstdio>#include <algorithm>#define N 100010#define M 90010#define LL __int64#define inf 0x3f3f3f3f#define lson l,mid,ans<<1#define rson mid+1,r,ans<<1|1#define getMid (l+r)>>1#define movel ans<<1#define mover ans<<1|1using namespace std;const LL mod = 1e9 + 7;struct node {    int to;    LL val;    node(int a, LL b) {        to = a;        val = b;    }};vector<node> mapp[N];vector<LL> v;bool vis[N];LL num[N];int n, m;void init() {    for (int i = 0; i <= n; i++) {        mapp[i].clear();    }    memset(num, 0, sizeof(num));    memset(vis, false, sizeof(vis));    v.clear();}void add(LL x) {    for (int i = 0; i < v.size(); i++) {        x = min(x, x^v[i]);    }    if (x) {        v.push_back(x);    }}void dfs(int u, int nums) {    vis[u] = true;    num[u] = nums;    for (int i = 0; i < mapp[u].size(); i++) {        int v = mapp[u][i].to;        if (vis[v]) {//如果有环的话,把另一种情况加入            add(nums^mapp[u][i].val^num[v]);        }        else {            dfs(v, nums^mapp[u][i].val);        }    }}int main() {    cin.sync_with_stdio(false);    int a, b;    LL c;    while (cin >> n >> m) {        init();        for (int i = 0; i < m; i++) {            cin >> a >> b >> c;            mapp[a].push_back(node(b, c));            mapp[b].push_back(node(a, c));        }        dfs(1, 0);        for (int i = 0; i < v.size(); i++) {            num[n] = min(num[n], num[n] ^ v[i]);        }        cout << num[n] << endl;    }    return 0;}
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 夜晚醒了睡不着怎么办 夜晚怕黑睡不着怎么办 宝宝不愿意盖被子怎么办 白天睡觉晚上睡不着怎么办 晚上睡觉不安神怎么办 晚上经常睡不着觉怎么办 老是睡不着觉怎么办啊 小孩睡觉不安稳怎么办 睡觉时动不了怎么办 特别累还睡不着怎么办 又累又睡不着怎么办 干活累的睡不着怎么办 狗一有动静就叫怎么办 楼上天天闹动静怎么办 喝了奶茶失眠怎么办 失眠一宿第二天怎么办 睡觉外面噪音大怎么办 怀孕早期晚上睡不着怎么办 短发发尾翘怎么办 很累就是睡不着怎么办 人累但是睡不着怎么办 如果晚上睡不着该怎么办 晚上睡不着觉该怎么办 晚上睡不着该怎么办呢 晚上失眠睡不着该怎么办 晚上一直睡不着该怎么办 怀孕晚上睡不着该怎么办 运动太累睡不着怎么办 运动完睡不着觉怎么办 晚上冷得睡不着怎么办 晚上脚冷睡不着怎么办 短发头发有点乱怎么办 不想让别人睡觉怎么办 15岁晚上睡不着怎么办 16岁青少年失眠怎么办 好累又睡不着怎么办 造口患者拉肚子怎么办? 起床后头发乱怎么办 新生儿睡觉偏头怎么办 婴儿睡觉偏头怎么办 月经期间血下不来怎么办