dis

07-图6 旅游规划 (25分)

浪子不回头ぞ 提交于 2020-04-04 13:19:53
题目描述 有了一张自驾旅游路线图,你会知道城市间的高速公路长度、以及该公路要收取的过路费。现在需要你写一个程序,帮助前来咨询的游客找一条出发地和目的地之间的最短路径。如果有若干条路径都是最短的,那么需要输出最便宜的一条路径。 输入格式: 输入说明:输入数据的第1行给出4个正整数N、M、S、D,其中N(2≤N≤500)是城市的个数,顺便假设城市的编号为0~(N−1);M是高速公路的条数;S是出发地的城市编号;D是目的地的城市编号。随后的M行中,每行给出一条高速公路的信息,分别是:城市1、城市2、高速公路长度、收费额,中间用空格分开,数字均为整数且不超过500。输入保证解的存在。 输出格式: 在一行里输出路径的长度和收费总额,数字间以空格分隔,输出结尾不能有多余空格。 输入样例: 4 5 0 3 0 1 1 20 1 3 2 30 0 3 4 10 0 2 2 20 2 3 1 20 输出样例: 3 40 解题思路 根据题意,可以看出这是一个单源有权图最短路径问题,使用Dijkstra算法解决,需要注意的是本题最短路径的含义是 先比较长度,再比较花费 。 代码 #include <stdio.h> #include <stdlib.h> #define MAXSIZE 500 #define INFINITY 600 typedef struct { int length; int

stringstream读入-最优乘车

女生的网名这么多〃 提交于 2020-03-30 15:34:49
最优乘车 H城是一个旅游胜地,每年都有成千上万的人前来观光。 为方便游客,巴士公司在各个旅游景点及宾馆,饭店等地都设置了巴士站并开通了一些单程巴士线路。 每条单程巴士线路从某个巴士站出发,依次途经若干个巴士站,最终到达终点巴士站。 一名旅客最近到H城旅游,他很想去S公园游玩,但如果从他所在的饭店没有一路巴士可以直接到达S公园,则他可能要先乘某一路巴士坐几站,再下来换乘同一站台的另一路巴士, 这样换乘几次后到达S公园。 现在用整数1,2,…N 给H城的所有的巴士站编号,约定这名旅客所在饭店的巴士站编号为1,S公园巴士站的编号为N。 写一个程序,帮助这名旅客寻找一个最优乘车方案,使他在从饭店乘车到S公园的过程中换乘的次数最少。 输入格式 第一行有两个数字M和N,表示开通了M条单程巴士线路,总共有N个车站。 从第二行到第M+1行依次给出了第1条到第M条巴士线路的信息,其中第i+1行给出的是第i条巴士线路的信息,从左至右按运行顺序依次给出了该线路上的所有站号,相邻两个站号之间用一个空格隔开。 输出格式 共一行,如果无法乘巴士从饭店到达S公园,则输出”NO”,否则输出最少换乘次数,换乘次数为0表示不需换车即可到达。 数据范围 1≤M≤100, 1≤N≤500 输入样例: 3 7 6 7 4 7 3 6 2 1 3 5 输出样例: 2 思路: 我们可以设所有可达边边权都是1

[最大流][匈牙利算法] 洛谷 P3386 二分图匹配

眉间皱痕 提交于 2020-03-23 18:45:39
题目描述 给定一个二分图,结点个数分别为n,m,边数为e,求二分图最大匹配数 输入输出格式 输入格式: 第一行,n,m,e 第二至e+1行,每行两个正整数u,v,表示u,v有一条连边 输出格式: 共一行,二分图最大匹配 输入输出样例 输入样例#1: 1 1 1 1 1 输出样例#1: 1 说明 n,m \leq 1000 n , m ≤ 1 0 0 0, 1 \leq u \leq n 1 ≤ u ≤ n, 1 \leq v \leq m 1 ≤ v ≤ m 因为数据有坑,可能会遇到 v>m v > m 的情况。请把 v>m v > m 的数据自觉过滤掉。 算法:二分图匹配 题解 看这题目也看着像板题,就是模板题,匈牙利、最大流两种做法 代码1 1 #include <cstdio> 2 #include <iostream> 3 #include <queue> 4 #define inf 0x3f3f3f3f 5 using namespace std; 6 queue<int>Q; 7 struct edge {int to,from,v;}e[2001000]; 8 int n,m,num,cnt,ans,s,t,dis[1010*4],head[1010*4],cur[1010*4]; 9 void insert(int x,int y,int z) { e[++cnt]

HDU-6532 Chessboard 2019广东省省赛B题(费用流)

懵懂的女人 提交于 2020-03-21 15:35:29
比赛场上很容易想到是费用流,但是没有想到建图方法qwq,太弱了。 这里直接贴官方题解: 费用流。 离散化坐标,每行用一个点表示,每列也用一个点表示。表示第i-1行的点向表示第i行的点连边,容量为第i行及以后能拿的棋子数的上限,费用为0,同理表示相邻列的点两两连边。若第i行第j列上有棋子,则表示第i行的点向表示第j列的点连边,容量为1,费用为该棋子的价值。可以定义源点表示第0行,汇点表示第0列,源点到汇点的最大费用流即为答案。 就是按照题解的建图方法,还有一些小细节:先要排序排除无用限制来减少限制边数,不然会超时。我用的办法是,按限制从小到大排序, 大限制当且仅当它的行数小于小限制行数时才有用 。列同理。这里想不明白的建议画图细细想。然后就是连边来表示限制条件: 行的话就是(i-1)->i行连边,列的话就是i->(i-1)列连边 ,这是因为0行是源点0列是汇点所致的,行点要靠它的入边来限制流量,列点要靠出边来限制流量。 细节详见代码及注释: #include<bits/stdc++.h> using namespace std; const int N=5000+10; const int M=100000+10; const int INF=0x3f3f3f3f; int n,m,r,c,s,t,maxflow,mincost; int nx,ny,x[N],y[N],xx[N]

9.3题解

佐手、 提交于 2020-03-14 12:17:48
T1 大家考场上都想到了暴搜,并且暴搜可以过,但是为什么还是有一大半的人$WA0$了呢,因为这题细节巨多,考场上我调了到快9点,才过了大样例,结果还是逃脱不了$WA0$的命运, 我太难了 其实思路上没有什么,你就枚举循环节的长度,把后面位置上有数字的对回来,看能不能合法就行了,记得疯狂调试 1 #include<algorithm> 2 #include<iostream> 3 #include<cstring> 4 #include<cstdio> 5 #include<vector> 6 #define inf 2139062143 7 #define maxm 10010 8 #define maxp 100100 9 using namespace std; 10 struct node{ 11 int p,x; 12 }a[maxm]; 13 int t,c,m,js,tail,len,pd; 14 int b[maxp],lon[5],ma[5],st[5],mi[5],stt[5]; 15 vector <int> chan; 16 bool cmp(const node &a,const node &b) 17 { 18 return a.p<b.p; 19 } 20 int main() 21 { 22 // freopen("1.in","r",stdin);

差分约束

烈酒焚心 提交于 2020-03-03 20:45:54
如果一个不等式组由 n 个变量和 m 个约束条件组成,形成 m 个形如x[ j ]-x[ i ]≤k(i,j∈[1,n] 且 k 为常数)的不等式,则称其为差分约束系统。换句话说,差分约束系统就是求解一组变量的不等式组的算法。 连边后求最短路 将x[ j ] ​ − x[ i ] ​ ≤ k 变形为 x[ j ] ​≤ k+ x[ i ] ​ ,即从 i 到j 连一条边权为 k 的边。加入超级源点后求最短路,得到 x i ​ ≤ 0 所有 x 最大解。 连边后求最长路 将 x[ j ] ​ − x[ i ] ​ ≤ k 变形为 x[ i ] ​ ≤ x[ j ]-k ​ ,即从 j 到 i 连一条边权为 − k 的边。加入超级源点后求最长路,得到 x i ​ ≥ 0 所有 x 最小解 1 #include<iostream> 2 #include<queue> 3 #include<cstdio> 4 #include<cstring> 5 using namespace std; 6 #define N 5005 7 #define M 11000 8 int n,m,cnt; 9 int head[N]; 10 struct edge{ 11 int to,w,nxt; 12 }e[M]; 13 void add(int u,int v,int w){ 14 e[++cnt]

python dis

不羁岁月 提交于 2020-02-29 04:32:01
day03$ cat declare.py i = 1 l = [] d = {} s = 'str' day03$ cat declare.txt day03$ vi declare.py day03$ ipython Python 2.7.6 (default, Jun 22 2015, 17:58:13) Type "copyright", "credits" or "license" for more information. In [1]: s = open('de') %%debug %debug declare.py def del delattr In [1]: s = open('declare.py').read() In [2]: co = compile(s, 'declare.py', 'exec') In [3]: import dis In [4]: dis.dis(co) 2 0 LOAD_CONST 0 (1) 3 STORE_NAME 0 (i) 4 6 BUILD_LIST 0 9 STORE_NAME 1 (l) 6 12 BUILD_MAP 0 15 STORE_NAME 2 (d) 8 18 LOAD_CONST 1 ('str') 21 STORE_NAME 3 (s) 24 LOAD_CONST 2 (None) 27 RETURN

python 求迷宫最短路径

杀马特。学长 韩版系。学妹 提交于 2020-02-26 19:14:27
##输入n行m列的矩阵,1为可通行,0为障碍,求左上角到右下角的最短路径 ###输入 6 5 1 1 0 1 1 1 0 1 1 1 1 0 1 0 0 1 0 1 1 1 1 1 1 0 1 1 1 1 1 1 ###输出 9 import queue pic = [] dis = [] visited = [] nx = [[1, 0], [-1, 0], [0, -1], [0, 1]] class Node(): def __init__(self, x, y): self.x = x self.y = y def bfs(): dis[0][0] = 0 q = queue.Queue() node = Node(0,0) q.put(node) while q.qsize(): point = q.get() if point.x == n-1 and point.y == m-1: break for i in range(4): dx = point.x + nx[i][0] dy = point.y + nx[i][1] if (0 <= dx < n and 0 <= dy < m and pic[dx][dy] == 1): newPoint = Node(dx, dy) q.put(newPoint) dis[dx][dy] = dis[point.x]

[NOI2018] 归程

只谈情不闲聊 提交于 2020-02-16 08:09:30
NOI2018 归程 题面较长,就不摆出来了,看下面 题面 Solution 那么大概复述一下题目大意 n个点,m条边,保证图联通,每条边有两个权值,一个 长度 ,一个 海拔 ,多组询问,告诉你起点和水位线, 小于等于 水位线的边都会被淹没,只能走路,否则可以开车,问从当天起点到1号节点最少 步行经过的长度 ,有些询问会强制在线 这道题是今年NOI的D1T1,当时在线打的时候,只打了个SPFA48分(直接跑),倍增优化60分 正解:Kruskal重构树/可持久化并查集 由于博主蒟蒻不会可持久化数据结构,所以讲Kruskal重构树 首先复习一下Kruskal最小生成树,是以并查集为辅助实现的,并通过路径压缩保证了时间复杂度,显然这样同时也会破坏树的原本的结构,但由于最小生成树不用保存这些信息,所以没什么影响,但Kruskal重构树就不同了.... Kruskal重构树的经典例题:给你一张图,每次询问两点之间所有简单路径中最大边权的最小值 常规做法,建出一棵最小生成树,答案就是树上的边权最小值 那么Kruskal重构树怎么做呢? 和kruskal类似,依然需要将边排序. 不同的是,我们建一个虚点,让两个联通快(查询的两个点的祖先)分别与虚点相连,这个虚点带有点权,点权就是本应相连的两个点之间的边权 这样的树有两个优雅的性质 这是一颗二叉树,并且相当于一个堆,因为边是有顺序合并的.

CodeForces - 734E

纵饮孤独 提交于 2020-02-14 15:15:25
直接缩点,然后跑一次树的直径就好了.... 至于跑树的直径 简易推导可得,原图的答案其实等价与两个最原点.... 因为(得到答案)就像水流一样,...一层一层的... 然后就结束了 #include<bits/stdc++.h> #define MAXN 200005 using namespace std; int n,tot,tt,tot2,maxl1=0,maxl2=0,maxl=0; int h[MAXN],h2[MAXN],color[MAXN];//1 white 2 black int belong[MAXN],dis[MAXN]; struct node{ int from,to,next; }e[MAXN<<1],e2[MAXN<<1]; void init(){ tot=tt=tot2=0; memset(h,-1,sizeof(h)); memset(h2,-1,sizeof(h2)); memset(belong,-1,sizeof(belong)); } void add(int x,int y){ tot++; e[tot].from=x; e[tot].to=y; e[tot].next=h[x]; h[x]=tot; } void dfs(int now,int fa){ if(belong[now]==(-1)){ tt++; belong[now