问题 C: 最短路径

在洛谷上刷最短路的题然后被老师拉回去做算法笔记上面的题。。。

拿到这道题,先确定所有路径唯一,然后是无向边,那么对于边权处理,直接赋值为2的k次方就可以了,然后直接跑最短路。

这种思路非常暴力,但仔细看题目的数据范围,k<=500,ull你估计都存不下,没救。有的同学可能会想,反正最后都要mod 1e5,那我在存储的时候mod就行了嘛,很多题都可以这样。但是对于最短路,你明显不可能这么跑,看下面这个例子

显然,你处理之后肯定会出错,那你就要换个思想了。如果你把边权2^k直接存储为k会怎么样呢?如果再进行一次最小生成树,最终处理的结果和跑最短路的答案其实是一样的(如图)

这样来想,这道题就迎刃而解了,在处理好最小生成树之后,我们知道出发点,然后DFS一遍整颗树,处理出每一个边权,记住有可能会有孤儿城市,与其他城市不连通,特判为-1

#include<bits/stdc++.h>
using namespace std;
const int MAXN=1e5+50;
const int mod=100000;
int f[MAXN];
int n,m;
int po[505];
struct edge {
int to,net,v;
} ee[MAXN]; //链式前向星
int head[MAXN];
int find(int x) {
if(f[x]==x) return x;
return f[x]=find(f[x]);
}
void merge(int x,int y) {
f[find(x)]=find(y);
}//并查集标准操作
int tot;
void add(int u,int v,int w) {
ee[++tot].net=head[u];
ee[tot].to=v;
ee[tot].v=w;
head[u]=tot;
}//建边
int ans[MAXN];
bool vis[MAXN];
void dfs(int s) {
vis[s]=1; //已经走过这个点
for(register int i=head[s]; i; i=ee[i].net)
if(!vis[ee[i].to]) { //如果没有走过
ans[ee[i].to]=(ans[s]%mod+po[ee[i].v])%mod; //当前节点的距离是父亲节点的距离+当前的权值
dfs(ee[i].to); //继续找儿子节点
}
}
int main() {
po[0]=1;
for(register int i=1;i<500;i++) po[i]=po[i-1]%mod*2%mod; //预处理2的幂
while(scanf("%d%d",&n,&m)!=EOF) {
memset(ans,0,sizeof ans);
memset(ee,0,sizeof ee);
memset(f,0,sizeof f);
memset(vis,false,sizeof vis);
memset(head,0,sizeof head);
tot=0; //多组数据一定记得清空数组和变量
for(register int i=0; i<n; i++) f[i]=i; //并查集初始化
for(register int i=1; i<=m; i++) { //最小生成树的实现
int u,v;
scanf("%d%d",&u,&v);
int x=find(u),y=find(v);
if(x!=y) { //如果不在一个集合
add(u,v,i-1);
add(v,u,i-1); //建双向变
merge(x,y); //合并
} //标准的Kruskal
}
dfs(0); //dfs找路的长度
for(register int i=1; i<n; i++) {
if(vis[i]!=0) {
cout<<ans[i]%mod<<endl;
} else cout<<-1<<endl; //处理答案,如果没被访问过,说明是孤儿
}
}
return 0;
}

问题 C: 最短路径的更多相关文章

  1. Johnson 全源最短路径算法

    解决单源最短路径问题(Single Source Shortest Paths Problem)的算法包括: Dijkstra 单源最短路径算法:时间复杂度为 O(E + VlogV),要求权值非负: ...

  2. Floyd-Warshall 全源最短路径算法

    Floyd-Warshall 算法采用动态规划方案来解决在一个有向图 G = (V, E) 上每对顶点间的最短路径问题,即全源最短路径问题(All-Pairs Shortest Paths Probl ...

  3. Dijkstra 单源最短路径算法

    Dijkstra 算法是一种用于计算带权有向图中单源最短路径(SSSP:Single-Source Shortest Path)的算法,由计算机科学家 Edsger Dijkstra 于 1956 年 ...

  4. Bellman-Ford 单源最短路径算法

    Bellman-Ford 算法是一种用于计算带权有向图中单源最短路径(SSSP:Single-Source Shortest Path)的算法.该算法由 Richard Bellman 和 Leste ...

  5. 最短路径算法-Dijkstra

    Dijkstra是解决单源最短路径的一般方法,属于一种贪婪算法. 所谓单源最短路径是指在一个赋权有向图中,从某一点出发,到另一点的最短路径. 以python代码为例,实现Dijkstra算法 1.数据 ...

  6. bzoj 4016: [FJOI2014]最短路径树问题

    bzoj4016 最短路路径问题 Time Limit: 5 Sec Memory Limit: 512 MB Description 给一个包含n个点,m条边的无向连通图.从顶点1出发,往其余所有点 ...

  7. 51nod 1459 迷宫游戏 (最短路径—Dijkstra算法)

    题目链接 中文题,迪杰斯特拉最短路径算法模板题. #include<stdio.h> #include<string.h> #define INF 0x3f3f3f3f ],v ...

  8. C++迪杰斯特拉算法求最短路径

    一:算法历史 迪杰斯特拉算法是由荷兰计算机科学家狄克斯特拉于1959 年提出的,因此又叫狄克斯特拉算法.是从一个顶点到其余各顶点的最短路径算法,解决的是有向图中最短路径问题.迪杰斯特拉算法主要特点是以 ...

  9. 求两点之间最短路径-Dijkstra算法

     Dijkstra算法 1.定义概览 Dijkstra(迪杰斯特拉)算法是典型的单源最短路径算法,用于计算一个节点到其他所有节点的最短路径.主要特点是以起始点为中心向外层层扩展,直到扩展到终点为止.D ...

  10. 最短路径之Floyd算法

    Floyd算法又称弗洛伊德算法,也叫做Floyd's algorithm,Roy–Warshall algorithm,Roy–Floyd algorithm, WFI algorithm. Floy ...

随机推荐

  1. Java实现 LeetCode 697 数组的度(类似于数组的map)

    697. 数组的度 给定一个非空且只包含非负数的整数数组 nums, 数组的度的定义是指数组里任一元素出现频数的最大值. 你的任务是找到与 nums 拥有相同大小的度的最短连续子数组,返回其长度. 示 ...

  2. Java实现 蓝桥杯VIP 算法训练 筛选号码

    算法训练 筛选号码 Description 有n个人围成一圈,顺序排号(编号为1到n).从第1个人开始报数(从1到3报数),凡报到3的人退出圈子.从下一个人开始继续报数,直到剩下最后一个人,游戏结束. ...

  3. Java实现 蓝桥杯VIP 算法提高 3-1课后习题2

    算法提高 3-1课后习题2 时间限制:1.0s 内存限制:256.0MB 问题描述 编写一个程序,接受用户输入的10个整数,输出它们的和. 输出格式 要求用户的输出满足的格式. 例:输出1行,包含一个 ...

  4. .Net Core 会逆袭成为最受欢迎开发平台吗?

    本文由葡萄城技术团队于博客园原创并首发 转载请注明出处:葡萄城官网,葡萄城为开发者提供专业的开发工具.解决方案和服务,赋能开发者. .Net Core 是什么? 最新.Net Core 热词霸占了各个 ...

  5. HDU-3033 I love sneakers! 题解

    题目大意 有 n 个物品,分成了 k 组,每个物品有体积和价值,把 n 个物品放到容量为 V 的背包中,保证每组至少放一件,求能获得的最大价值,如果不能实现,输出"Impossible&qu ...

  6. Flask 四剑客

    Flask 四剑客 返回字符串,返回 html , 跳转路由,返回 json from flask import Flask, render_template, redirect, jsonify a ...

  7. Flutter实战】文本组件及五大案例

    老孟导读:大家好,这是[Flutter实战]系列文章的第二篇,这一篇讲解文本组件,文本组件包括文本展示组件(Text和RichText)和文本输入组件(TextField),基础用法和五个案例助你快速 ...

  8. Elasticsearch原理入门

    这是一篇拼接贴,我是缝合怪 项目中用到了es,使用方法是挺简单的,封装了基本api以后,把查询条件封装一下传给client执行就可,但是光使用比较肤浅,研究一下原理和本质,更利于以后开发使用 扫盲贴 ...

  9. Activity学习笔记1

    Activity概述 简单的理解Activity就是指Android手机或平板的一个屏,类似Window的一个窗口,浏览器的一个页面. Activity的4种状态 Activity的生命周期 创建Ac ...

  10. 消息队列——ActiveMQ使用及原理浅析

    文章目录 引言 正文 一.ActiveMQ是如何产生的? 产生背景 JMS规范 基本概念 JMS体系结构 二.如何使用? 基本功能 消息传递 P2P pub/sub 持久订阅 消息传递的可靠性 事务型 ...