【LGOJ5651】基础最短路练习题

你以为这是最短路,其实完全不是最短路

这题的难点在于对题面这句话的理解:

"保证G中不存在简单环使得边权异或和不为0"

意思是,图里面出现的环,其上的权值异或和一定为0

思考一下这样的环有什么特点呢?

无论在这个环上怎么走,走一边和另一边的答案一定是相同的!

因为两个相同的数异或为0,即这个环的两边的边权是一样的

所以我们只需要在图上随便跑出一棵树,直接输出两个点之间的路径异或值即可

代码:

#include<bits/stdc++.h>
#define ll long long
#define N 500005
using namespace std;

int n,m,q,u,v;
ll w;

struct Edge
{
    int next,to;
    ll dis;
}edge[N<<1];
int cnt=0,head[N];

inline void add_edge(int from,int to,ll dis)
{
    edge[++cnt].next=head[from];
    edge[cnt].to=to;
    edge[cnt].dis=dis;
    head[from]=cnt;
}

int dep[N];
ll dis[N];
void dfs(int u,int fa)
{
    for(register int i=head[u];i;i=edge[i].next)
    {
        int v=edge[i].to;
        if(v==fa) continue;
        if(dep[v]!=0x3f3f3f3f) continue;
        dep[v]=dep[u]+1;
        dis[v]=dis[u]^edge[i].dis;
        dfs(v,u);
    }
}

template<class T>inline void read(T &res)
{
    char c;T flag=1;
    while((c=getchar())<'0'||c>'9')if(c=='-')flag=-1;res=c-'0';
    while((c=getchar())>='0'&&c<='9')res=res*10+c-'0';res*=flag;
}

int main()
{
    read(n);read(m);read(q);
    for(register int i=1;i<=m;++i)
    {
        read(u);read(v);read(w);
        add_edge(u,v,w);
        add_edge(v,u,w);
    }
    memset(dep,0x3f,sizeof(dep));
    dep[1]=0;
    dfs(1,0);
    while(q--)
    {
        read(u);read(v);
        printf("%lld\n",dis[u]^dis[v]);
    }
    return 0;
}

原文地址:https://www.cnblogs.com/tqr06/p/11854587.html

时间: 2024-10-10 00:57:17

【LGOJ5651】基础最短路练习题的相关文章

基础最短路2

基础最短路 Description 某省自从实行了很多年的畅通工程计划后,终于修建了很多路.不过路多了也不好,每次要从一个城镇到另一个城镇时,都有许多种道路方案可以选择,而某些方案要比另一些方案行走的距离要短很多.这让行人很困扰. 现在,已知起点和终点,请你计算出要从起点到终点,最短需要行走多少距离. Input 本题目包含多组数据,请处理到文件结束.  每组数据第一行包含两个正整数N和M(0<N<200,0<M<1000),分别代表现有城镇的数目和已修建的道路的数目.城镇分别以0

基础最短路

基础最短路 Description 在每年的校赛里,所有进入决赛的同学都会获得一件很漂亮的t-shirt.但是每当我们的工作人员把上百件的衣服从商店运回到赛场的时候,却是非常累的!所以现在他们想要寻找最短的从商店到赛场的路线,你可以帮助他们吗? Input 输入包括多组数据.每组数据第一行是两个整数N.M(N<=100,M<=10000),N表示成都的大街上有几个路口,标号为1的路口是商店所在地,标号为N的路口是赛场所在地,M则表示在成都有几条路.N=M=0表示输入结束.接下来M行,每行包括3

HDU 1874 畅通工程续 (基础最短路)

题意  中文 最基础的最短路  注意边可能多次给出  取最小的 #include<cstdio> #include<cstring> using namespace std; const int N = 205, M = 1005; int mat[N][N], v[N], d[N], n, m, s, t; void dijkstra() { memset(d, 0x3f, sizeof(d)); memset(v, 0, sizeof(v)); for(int i = d[s]

图论基础——最短路算法集锦

最短路算法有个基础——————松弛操作(在大多数最短路算法都会涉及) if(d[e[i].v]>d[e[i].u]+w[i])//如果这条边的终点到源点的距离大于起点到源点距离,就替换. { d[e[i].v]>d[e[i].u]+w[i]; } 最短路算法一共有多少种方法我不知道,在这里我只想记录4种: •Dijkstra:求单源点最短路(不含负边权) •Bellman-ford:求单源点最短路(可含负边权) •SPFA(使用队列优化后的Bellman-ford) •Floyd:求各点间的最

基础最短路(模板 bellman_ford)

Description 在每年的校赛里,所有进入决赛的同学都会获得一件很漂亮的t-shirt.但是每当我们的工作人员把上百件的衣服从商店运回到赛场的时候,却是非常累的!所以现在他们想要寻找最短的从商店到赛场的路线,你可以帮助他们吗? Input 输入包括多组数据.每组数据第一行是两个整数N.M(N<=100,M<=10000),N表示成都的大街上有几个路口,标号为1的路口是商 店所在地,标号为N的路口是赛场所在地,M则表示在成都有几条路.N=M=0表示输入结束.接下来M行,每行包括3个整数A,

基础最短路(模板 spfa)

Description 虽然草儿是个路痴(就是在杭电待了一年多,居然还会在校园里迷路的人,汗~),但是草儿仍然很喜欢旅行,因为在旅途中 会遇见很多人(白马王子,^0^),很多事,还能丰富自己的阅历,还可以看美丽的风景……草儿想去很多地方,她想要去东京铁塔看夜景,去威尼斯看电影,去 阳明山上看海芋,去纽约纯粹看雪景,去巴黎喝咖啡写信,去北京探望孟姜女……眼看寒假就快到了,这么一大段时间,可不能浪费啊,一定要给自己好好的放个 假,可是也不能荒废了训练啊,所以草儿决定在要在最短的时间去一个自己想去的地

POJ Big Christmas Tree(基础最短路)

Big Christmas Tree 题目分析: 叫你构造一颗圣诞树,使得 (sum of weights of all descendant nodes) × (unit price of the edge)尽量的小.转换后就是求根节点到每个节点的距离最短,也就是最短路.生成树可能会超时,我没试过.然后,求解最短路要用优化的解法不然会超时.最后的答案就是:sum = w[1] * dist[1] + w[2] * dist[2] + ..... w[n] * dist[n].可以自己推推样例就

pythoon介绍、安装环境、基础知识、练习题

pyrhoon介绍:创始人为吉多·范罗苏姆(Guido van Rossum)(龟叔) Python崇尚优美.清晰.简单,是一个优秀并广泛使用的语言. Python可以应用于众多领域,如:数据分析.组件集成.网络服务.图像处理.数值计算和科学计算等众多领域. 目前Python主要应用领域:云计算(云计算最火的语言, 典型应用OpenStack).WEB开发(众多优秀的WEB框架,众多大型网站均为Python开                                 发,Youtube,

poj1125 基础最短路

题目:https://vjudge.net/problem/POJ-1125 Stockbrokers are known to overreact to rumours. You have been contracted to develop a method of spreading disinformation amongst the stockbrokers to give your employer the tactical edge in the stock market. For