题意:给你点.边,求起点到终点的最短距离. 题解:由于题目的数据量特别大,所以需要用邻接表来存边,之后对Dijkstra算法稍微魔改一下就可以了,本来以为会超时,做好了打堆优化的准备,结果卡时间过了,可以说很开心了. 注意SPFA会超时. #include <queue> #include <cmath> #include <stack> #include <cstdio> #include <cstring> #include <cstd…
题目: A 国有 n 座城市,n−1 条双向道路将这些城市连接了起来,任何两个城市都可以通过道路互通. 某日,A 国爆发了丧尸危机,所有的幸存者现在都聚集到了 A 国的首都(首都是编号为 1 的城市).而其它城市的丧尸会时不时地向首都发起进攻. 为了抵御丧尸的攻击,幸存者在 A 国的每座城市都修建了防御工事.编号为 i 的城市,其防御工事强度为 di. 当一只丧尸决定进攻首都时,它会从某城市 u(u≠1) 沿经过道路数量最少的路径前往首都.沿途,这只丧尸会试图突破当地的防御工事. 对于某座防御工…
Candies POJ-3159 这里是图论的一个应用,也就是差分约束.通过差分约束变换出一个图,再使用Dijikstra算法的链表优化形式而不是vector形式(否则超时). #include<iostream> #include<cstdio> #include<cstring> #include<algorithm> #include<string> #include<vector> #include<queue>…
Silver Cow Party Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 12674   Accepted: 5651 Description One cow from each of N farms (1 ≤ N ≤ 1000) conveniently numbered 1..N is going to attend the big cow party to be held at farm #X (1 ≤ X …
通过最小生成树(prim)和最短路径优化引出的向前星存图,时至今日才彻底明白了.. head[i]存储的是父节点为i引出的最后一条边的编号, next负责把head[i]也就是i作为父节点的所有边连接起来,next也是存的编号, 在所存的edge结构体中,只有w是保存边的值,而u是保存的子节点. 这样设置的话,由head[i]就可以引出所有与i相关的边和点, 显而易见,这样的存放方法空间+时间复杂度双优化,比邻接矩阵是优化多了.. 然后就是prim算法, 最小生成树的一种算法,适用于稠密图,因为…
这道模版用到了链式向前星表示法: struct node { int v,next; }edge[]; void add(int x,int y) { edge[++cnt].next=heads[x]; edge[cnt].v = y; heads[x]=cnt; return ; } 有地方写错了,应该是i=edge[i].next 输入:一个图有向图.输出:它每个强连通分量. input: 6 8 1 3 1 2 2 4 3 4 3 5 4 6 4 1 5 6 output: 6 5 3…
layout: post title: 训练指南 UVA - 10917(最短路Dijkstra + 基础DP) author: "luowentaoaa" catalog: true mathjax: true tags: - 最短路 - 基础DP - Dijkstra - 图论 - 训练指南 Walk Through the Forest UVA - 10917 题意 Jimmy打算每天沿着一条不同的路走,而且,他只能沿着满足如下条件的道路(A,B):存在一条从B出发回家的路径,比…
layout: post title: 训练指南 UVA - 11374(最短路Dijkstra + 记录路径 + 模板) author: "luowentaoaa" catalog: true mathjax: true tags: - 最短路 - Dijkstra - 图论 - 训练指南 Airport Express UVA - 11374 题意 机场快线有经济线和商业线,现在分别给出经济线和商业线的的路线,现在只能坐一站商业线,其他坐经济线,问从起点到终点的最短用时是多少,还有…
代码: struct NODE{ int to; int nxt; int c; }node[MM];//链式向前星 ; void add(int a,int b,int c){ node[lcnt].to=b; node[lcnt].c=c; node[lcnt].nxt=head[a]; head[a]=lcnt++; } 显示神奇代码 1.使用结构体构建链式向前星的容器 链式向前星本质上是使用链表存边,一条链表代表着一个点发出的所有边.所以一个这个结构体代表着这条链表中的一项 struct…
题目连接:10986 - Sending email 题目大意:给出n,m,s,t,n表示有n个点,m表示有m条边,然后给出m行数据表示m条边,每条边的数据有连接两点的序号以及该边的权值,问说从点s到点t的最短路径是多少. 解题思路:本题应该是无环正权值的一个图,并且本题如果直接用Dijkstra算法去做的话超时,所以一定要用优先队列去进行优化,<算法竞赛入门经典>中介绍了这种写法,唯一变动的地方就是有向图变成了无向图. #include <stdio.h> #include &l…