题目链接:Flight
这道题的题意是,有一次机会,可以将直接连接两点的路的长度减半,然后求起点到终点的最短距离
首先不能用的思路是先求出最短路径,然后将该路径上最长的边长度减半
稍微想一想也是不行的
然后,再想到的是依次让每一条边的长度都减半,接着求最短距离
这样虽然简单,但是应该会超时
比较好的写法是,遍历每条边,让它的权值减半,然后求出起点到这条边起点的距离,和终点到这条边终点的距离,相加
求终点到这条边终点的最短距离的做法是反向建图
参考代码:
#include <map>
#include <queue>
#include <vector>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <iostream>
#include <algorithm>
const long long INF=0x3f3f3f3f3f3f3f3fll;
using namespace std;
struct node{
int to,cost;
};
int V;
long long d[200005];
vector<node> G[200005];
typedef pair<int,int> P;
void dijkstra(int s){
int i,v;
priority_queue<P,