思路
这道题看似是一道常见的最短路的题目,但是边权非常大,如果要写成高精度可能会非常麻烦。但是如果模拟一遍就可以发现一些有用的细节。
如果按照以下的顺序读入边:
e1 e1
e2 e3
e3 e1
那么是否这三条边都是有用的呢?答案是否定的,因为第i行输入边权是2(i-1)由二进制的知识可以知道,此前的所有边权都加起来也不会超过这个权值,也就是说如果这两个节点已经在此前构建的某一个连通图中,那么当前输入的边权就一定可以舍去。那么此时问题就退化成了构建一个MST的问题。显然此时使用并查集构建一个MST,再套一个Dijkstra的壳就可以了。
#include <iostream>
#include <queue>
#include <stdlib.h>
#include <stdio.h>
#include <map>
#include <string>
#include <cstdlib>
#include <stack>
#include <vector>
#include <math.h>
#include <algorithm>
#include <typeinfo>
#include