上一页 1 ··· 20 21 22 23 24 25 26 27 28 ··· 34 下一页
摘要: 嘿嘿,跟pku 1151 差不多,都是单源最短路,这次求的是每个点往返最短时间中的最大值,就是先按pku1151一样,求往返俩次的最短路,再求出最大值即可代码基本没怎么改#include <iostream>#include<string>#include<stdlib.h>using namespace std;const int MAX = 1010;const int inf = INT_MAX;int N,m,n,num,s;typedef struct vol{ int w,//当前位置 v,//价值 value next;//下一结点的位置} V 阅读全文
posted @ 2011-08-15 02:02 枕边梦 阅读(155) 评论(0) 推荐(0) 编辑
摘要: 这题目限制是8000ms,一看就不怎么做得下去了,但题目意思倒是很简单求源点到其他各个点之和 加上 其他各个点到源点之和的最小值建立正反两个邻接表,作正反两次最短路,SPFA逆序的情况:在初始化的时候在反向保存另一相同表 即: 1 ---> 2 13 反向后:2 ---> 1 13 要求各点到源点的距离和,即求源点到各点的距离和 所以,处理好后,只要求两次源点到各点距离和相加即可#include <iostream>#include<string>#include<stdlib.h>using namespace std;const int MA 阅读全文
posted @ 2011-08-15 01:39 枕边梦 阅读(141) 评论(0) 推荐(0) 编辑
摘要: 多个起点,一个终点,求最短路,额,一开始三种SPFA都试了一下,用队列实现,用栈实现,唉,都悲剧的TLE了,怎么就没想到呢,把终点变成起点,就只需要调用一次SPFA了,而且,最后在遍历一下,找出路径最短的原先的起点,#include<iostream> #include<queue>#define MAXINT 9999999 #define MAXN 1010 using namespace std; int vis[MAXN],dis[MAXN],n,num,m; int root[MAXN],cou[MAXN]; struct edge { int u,w,nex 阅读全文
posted @ 2011-08-14 16:58 枕边梦 阅读(185) 评论(0) 推荐(0) 编辑
摘要: 这题目是pku1201的简化版本,稍微改一下输入就AC了题目大意:给 n 个区间,从每个区间至少取两个不同的元素。求形成的新的集合最少包含多少个元素。* 思路:对于每个区间 [ ai , bi ]至少取两个元素 => num [ b ] - num [ a - 1 ] >= 2* 隐含条件: 1 >= num [ i ] - num [ i - 1 ] >=0* 求:num [ max ] - num [ min - 1 ] >= ans;刚发现一个问题,不知道自己有没有理解错:看下面俩段代码:1)//for(int i=min1;i<=max1;i++)/ 阅读全文
posted @ 2011-08-14 15:10 枕边梦 阅读(316) 评论(0) 推荐(0) 编辑
摘要: 题意:小孩A认为小孩B比自己多出的最多不会超过c个糖果,也就是 B - A <= c,正好符合差分约束方程,就是A到B的边权w(A, B) = c;用 SPFA + 栈 能过。这题目,应该也算是差分约束的基础题吧,只不过用SPFA+队列实现超时了,无语呀#include<iostream>#define MAXINT 9999999#define MAXN 30010using namespace std;int vis[MAXN],dis[MAXN],n,num,m;int root[MAXN],stack[MAXN];struct edge{ int u,w,next;} 阅读全文
posted @ 2011-08-14 13:50 枕边梦 阅读(170) 评论(0) 推荐(0) 编辑
摘要: 果然,差分约束的构图才是最关键的步骤,spfa的过程基本已经很熟了,用队列实现的话在加边的时候,理解错了,重复加边了,s[a]-s[b]>=c 跟s[b]-s[a]>=-c 有区别么?天啊,秀逗了,我来了俩个add(a,b,c),add(b,a,-c)………………题目有三个判断条件,存在负环,则无解,dis[n]=MAXINT,则可以为任意距离#include<iostream>#include<queue>#define MAXINT 9999999#define MAXN 1010using namespace std;int vis[MAXN],cou 阅读全文
posted @ 2011-08-14 09:59 枕边梦 阅读(171) 评论(0) 推荐(0) 编辑
摘要: 唉,这明明也是一道差不多的题目,为什么构图完之后,还是错了很久,我很不解呀,一直改,一直改,但是时间还是很慢,2766ms,SPFA+队列实现所以很想改一下,用栈来实现,可结果却是给了我一个TLE,无语呀,不知道怎么回事,看了大牛的很快呀,差不多500ms,用SPFA+栈实现,难道是我在预处理,构图的时候,慢了?不解呀?我自己的加边操作很方便,可是很慢吗?= =!郁闷,看来得改改习惯了额,都没讲下题目:分析题意:输入有两种形式:1:P A B X 即 B + X = A 转化一下: B - A <= -X, A - B <= X 构造边和权:(A, B, -X), (B, A, X 阅读全文
posted @ 2011-08-14 02:31 枕边梦 阅读(237) 评论(0) 推荐(0) 编辑
摘要: 这题目应该算是比较基础的差分约束吧,嘻嘻,也算是我的第一道差分约束,理解了题意之后,就是转化和构图的问题了 Normal 0 7.8 磅 0 2 false false false MicrosoftInternetExplorer4 构图方法:首先进行转换:a[j]+...+a[j+m] = a[1]+...a[j+m] - (a[1]+...+a[j-1]) = sum[j+m] - sum[j-1]>(<) ki. 差分约束只能全部是<=或者(>=).第二步转换: sum[j+m]-sum[j-1] <= ki-1 或者sum[j-1]-sum[j+m] & 阅读全文
posted @ 2011-08-14 00:08 枕边梦 阅读(182) 评论(0) 推荐(0) 编辑
摘要: 这题目,我差点彻底崩溃了,郁闷死了,一开始一直TLE,原来只有一个测试数据,这叫我情何以堪……后来,还发现了一个错误,就是构图时候,最大节点跟最小节点还是要标记一下比较好,我本来是默认0是最小节点的,可是在后面添加新边的时候又添加了一个0节点,唉就是Sbi+1-Sai>=Ci,这样来添加边计较保险用数组模拟队列来实现SPFA的时候,数组要绝对的足够大,我就这样RE了无数次,最后Q[maxn*10]才过的,但此时内存已经很大了不过也可以直接用STL里面的queue来做,方便很多,内存也不算很大还有用栈实现的,这个就很省内存啦为什么用栈写有时候会很快呢? 首先它很节省空间,因为最多有v-1个 阅读全文
posted @ 2011-08-13 12:22 枕边梦 阅读(187) 评论(0) 推荐(0) 编辑
摘要: 用spfa做,额,到目前为止做的题目都几乎是模板题,三四道都是改一下输入就了事了,不过针对题目而已,还真有选择的余地,这里一个是我的,额,内存开得太大了,主要是1000*1000的矩阵来保存一个图的信息,本来很明显的得用邻接表来储存的,,而且只保存有用的边,而且加上用队列优化,快了不少呢对比一下俩个代码吧用邻接表的:#include<cstdio>#include<iostream>using namespace std;#define N 4000struct edge{ int v,next,cost; edge(int _v=0 ,int _next=0,int 阅读全文
posted @ 2011-08-13 00:24 枕边梦 阅读(184) 评论(0) 推荐(0) 编辑
上一页 1 ··· 20 21 22 23 24 25 26 27 28 ··· 34 下一页