列表

详情


NC220582. XortestPath

描述

    Rules and regulations about mileage reimbursement for employees are very clear: the employee should be refunded an amount of money proportional to the shortest distance between their home and office. This causes your X-mas Ornaments Retailer a great deal of pain: every year more and more money is spent on reimbursement and this means your companies have less profit! This obviously has to be stopped and so you delve deep into the regulations about reimbursement, hoping to find a loophole so you do not have to give as much money to your employees.

    However, the rules seem pretty strict. As long as the employees keep track of the distances they have travelled, you are forced to reimburse them. Suddenly you have a flash of inspiration: nowhere does it say that you have to use the Euclidean distances! You start working on more subtle distance functions and now you have a first prototype: XOR distance. The length of a path is defined as the XOR of the lengths of the edges on the path (as opposed to the sum). The distance between two locations is defined as the length of the shortest path between them. You hope that the authorities will not notice that this does not define a metric, but before you send them your proposal you want to experiment with this distance first.

    You cook up a simple connected weighted undirected graph with this distance function, and you ask yourself  questions about this graph, each asking about the shortest XOR distance between two nodes.

输入描述

The input consists of:

- One line containing three integers  (),  (), and  (), the number of nodes, edges, and questions respectively.

 lines describing an edge. Each line consists of three integers  ( and ), indicating that there is an undirected edge of length  between nodes  and .

 lines describing a question. Each line consists of two integers  () asking for the shortest distance between nodes  and .

There is at most one edge between any pair of distinct nodes and every node can be reached from any other node.

输出描述

For every question, output one line containing the shortest distance between nodes  and .

示例1

输入:

3 3 3
1 2 2
1 3 2
2 3 3
1 2
1 3
2 3

输出:

1
1
0

示例2

输入:

7 10 5
1 2 45
2 3 11
2 4 46
3 4 28
3 5 59
3 6 12
3 7 3
4 5 11
5 6 23
6 7 20
1 4
2 6
3 5
1 7
5 5

输出:

1
5
0
5
0

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

C++(clang++11) 解法, 执行用时: 141ms, 内存消耗: 13904K, 提交时间: 2021-04-08 11:37:04

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
#define b(x) (1ll<<((x)-1))
ll a[70],sb[100500],w;
int i,j,k,n,m,x,y,t,vis[100500];
vector<pair<int,ll> >v[100500];
void upd(){
	int i,j;
	for(i=1;i<=60;i++){
		for(j=i+1;j<=60;j++){
			if(a[i]&a[j]){a[j]^=a[i];}
		}
	}
}

void add(ll x){
	int i,j;
	for(i=60;i>=1;i--){
		if(x&b(i)){
			if(a[i]){x^=a[i];}
			else{a[i]=x;break;}
		}
	}
}

void dfs(int k){
	vis[k]=1;
	for(auto [i,j]:v[k]){
		if(!vis[i]){sb[i]=sb[k]^j;dfs(i);}
		else{add(sb[i]^sb[k]^j);}
	}
}

ll get(ll x){
	for(int i=60;i>=1;i--){
		if(x&b(i)){x^=a[i];}
	}
	return x;
}

int main(){
	scanf("%d%d%d",&n,&m,&t);
	for(i=1;i<=m;i++){
		scanf("%d%d%lld",&x,&y,&w);
		v[x].push_back({y,w});
		v[y].push_back({x,w});
	}
	dfs(1);upd();
	while(t--){
		scanf("%d%d",&x,&y);
		printf("%lld\n",get(sb[x]^sb[y]));
	}
}

上一题