刷题总结———长跑路径(ssoj1982)
题目:
给定一个无向图···求特定几个点中两两间的最短路中的最小值····其中1≤N,M≤100000;T≤5;1≤K≤n;1≤边长≤100000,T为一个测试点的测试数··k为测试点数量
题解:
我们按1到k给每个点编一个编号······然后枚举编号的二进制的每一位,将这一位为1的点连边S(作为起点),为0的点连边T(作为终点),跑最短路就可以了···时间复杂度n*logn*logn···
以后求最短路都用dijkstra不用SPFA了···注意当我们一求出连向T的点中第一个点的最小值时就可以break了····因为每个点每次入队时的距离就是其最小值··
不得不说按二进制分类的方法很妙啊···
代码:
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cmath>
#include<ctime>
#include<cctype>
#include<cstring>
#include<algorithm>
#include<string>
#include<queue>
using namespace std;
priority_queue< pair<int,int> >que;
const int N=1e5+;
int first[N],go[N*],next[N*],val[N*],tot;
int T,n,m,k,spep[N],num[N],ans,dis[N];
inline int R()
{
char c;int f=;
for(c=getchar();c<''||c>'';c=getchar());
for(;c<=''&&c>='';c=getchar()) f=(f<<)+(f<<)+c-'';
return f;
}
inline void pre()
{
memset(first,,sizeof(first));tot=;ans=0x3f3f3f3f;memset(num,,sizeof(num));
}
inline void comb(int a,int b,int c)
{
next[++tot]=first[a],first[a]=tot,go[tot]=b,val[tot]=c;
next[++tot]=first[b],first[b]=tot,go[tot]=a,val[tot]=c;
}
inline void getans()
{
for(int t=;(<<t)<=k;t++)
{
memset(dis,0x3f3f3f3f,sizeof(dis));
while(!que.empty()) que.pop();
for(int i=;i<=k;i++)
if(num[spep[i]]&(<<t))
dis[spep[i]]=,que.push(make_pair(,spep[i]));
while(!que.empty())
{
int u=que.top().second;
que.pop();
if(num[u]&&!(num[u]&(<<t))) {ans=min(ans,dis[u]);break;}
for(int e=first[u];e;e=next[e])
{
int v=go[e];
if(dis[v]>dis[u]+val[e])
{
dis[v]=dis[u]+val[e];
que.push(make_pair(-dis[v],v));
}
}
}
}
}
int main()
{
//freopen("a.in","r",stdin);
T=R();
while(T--)
{
pre();
n=R(),m=R();int a,b,c;
for(int i=;i<=m;i++) a=R(),b=R(),c=R(),comb(a,b,c);
k=R();
for(int i=;i<=k;i++) spep[i]=R(),num[spep[i]]=i;
getans();cout<<ans<<endl;
}
return ;
}
刷题总结———长跑路径(ssoj1982)的更多相关文章
- leetcode刷题-62不同路径2
题目 一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为“Start” ). 机器人每次只能向下或者向右移动一步.机器人试图达到网格的右下角(在下图中标记为“Finish”). 现在 ...
- leetcode刷题-64最小路径和
题目 给定一个包含非负整数的 m x n 网格,请找出一条从左上角到右下角的路径,使得路径上的数字总和为最小. 说明:每次只能向下或者向右移动一步. 示例: 输入:[ [1,3,1], [1,5, ...
- LeetCode刷题笔记-递归-路径总和
题目描述: 给定一个二叉树和一个目标和,判断该树中是否存在根节点到叶子节点的路径,这条路径上所有节点值相加等于目标和. 说明: 叶子节点是指没有子节点的节点. 示例: 给定如下二叉树,以及目标和 su ...
- leetcode刷题-71简化路径
题目 以 Unix 风格给出一个文件的绝对路径,你需要简化它.或者换句话说,将其转换为规范路径. 在 Unix 风格的文件系统中,一个点(.)表示当前目录本身:此外,两个点 (..) 表示将目录切换到 ...
- leetcode刷题-62不同路径
题目 一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为“Start” ). 机器人每次只能向下或者向右移动一步.机器人试图达到网格的右下角(在下图中标记为“Finish”). 问总 ...
- Leetcode刷题6—不同路径
一.要求 二.知识点 这道题属于动态规划,主要思路就是将大问题不断分解成小问题进行求解 三.解题思路 1.利用数学思路找规律 将m和n组合成一个m*n的矩阵,而且是一个对称阵 [[0],[1],[1] ...
- LeetCode 高效刷题路径
LeetCode 高效刷题路径 Hot 100 https://leetcode.com/problemset/hot-100/ https://leetcode-cn.com/problemset/ ...
- 教你用python写:HDU刷题神器
声明:本文以学习为目的,请不要影响他人正常判题 HDU刷题神器,早已被前辈们做出来了,不过没有见过用python写的.大一的时候见识了学长写这个,当时还是一脸懵逼,只知道这玩意儿好屌-.时隔一年,决定 ...
- 【刷题记录】BZOJ-USACO
接下来要滚去bzoj刷usaco的题目辣=v=在博客记录一下刷题情况,以及存一存代码咯.加油! 1.[bzoj1597][Usaco2008 Mar]土地购买 #include<cstdio&g ...
随机推荐
- Service Unavailable HTTP Error 503. The service is unavailable.
原因: public void SetCurrentType(string[] projTypes) { _ProjTypes = _ProjTypes; } 确保没有无限递归或无限循环
- errno的用法
Linux中系统调用的错误都存储于 errno中,errno由操作系统维护,存储就近发生的错误,即下一次的错误码会覆盖掉上一次的错误. 编程时需要包含#include <errno.h>, ...
- 对O(logN)复杂度的推导
之前一直对O(logN)这个复杂度如何推导出的存在疑问,这段时间看了一些算法相关的内容,正好看到这个问题,大略研究了一下算是基本解答了我的疑惑:现记录如下 假设有一棵高为H的满二叉树,则它的节点共有N ...
- Golang TCP转发到指定地址
Golang TCP转发到指定地址 第二个版本,设置指定ip地址 代码 // tcpForward package main import ( "fmt" "net&qu ...
- 详解wordpress如何把文件保存到阿里云OSS上!
自己搞了一个Wordpress的博客,装完之后一直晾着没管,最近闲来开荒.为了减小服务器的带宽.存储.CUP的压力,决定把博客中的所有文件都保存到阿里云OSS上面. 关于这个问题,自己去调用OSS的S ...
- Redis的安装、服务配置
在网上找了很多资料,有些可以正常安装,有些安装会出毛病,仔细想了想,还是自己整理一份吧,仅仅为自己下次再用的时候,能够快速的定位到可以正常用的文章! 我使用的是VMware Workstation P ...
- 【实验吧】编程循环&&求底运算
要好好学写脚本!!! 循环: 题目介绍 给出一个循环公式,对于一个整数n,当n为奇数时,n=3n+1,当n为偶数时,n=n/2,如此循环下去直到n=1时停止. 现要求对两个整数i = 900.j = ...
- (转)JVM各种内存溢出是否产生dump
对于java的内存溢出,如果配置-XX:+HeapDumpOnOutOfMemoryError,很明确的知道堆内存溢出时会生成dump文件.但永久代内存溢出不明确是否会生成,今天来做一个实验: 永久代 ...
- Elasticsearch安装---安装jdk
1.在Linux 上检查Java版本是否满足要求: java -version 如果运行上面命令时报错:-bash: java: command not found,首先检查是否有jdk ,要是有安装 ...
- Java技术——多态的实现原理
.方法表与方法调用 如有类定义 Person, Girl, Boy class Person { public String toString(){ return "I'm a person ...