摘要:
只有一点转化就是一路上的速度在每一段是有变化的,但是实质上到达每一点的速度是一定的v*2^(1-h),那么也就是边权确定,可以用spfa求解,还有一点就是初始化要大,应为可以-25 <= E <= 25,也就是可能存在2^(50)这种数据。View Code 1 #include <stdio.h> 2 #include <string.h> 3 #include <math.h> 4 #include <queue> 5 using std::queue; 6 #define INF 11258999068426240000 7 # 阅读全文
摘要:
这两题是经典的差分约束系统,稍微学习一下就可以指导如何转化为差分约束,3169里可以看到明确的其源点1,所以求解的是从1出发终点为n的最短路,而1201则不太明显(我的代码是将其转化为最长路),但是要注意min,max在代码中的意义,和dist的定义,详情可以参考论文《数与图的完美结合--差分约束系统》,我想说的是我们要求接的是dist[max]-dist[min]的最大值,那么将dist[min]置为0然后求其到max的最大值不是更方便。3169View Code 1 #include <stdio.h> 2 #include <queue> 3 #include & 阅读全文
摘要:
初次尝试查分约束,遇见问题很多,总的来说这题还是比较裸地View Code 1 #include <stdio.h> 2 #include <string.h> 3 #include <queue> 4 using std::queue; 5 #define MAXN 110 6 #define INF (1<<29) 7 int n,m; 8 struct node 9 {10 int d,c,next;11 }edge[2*MAXN];12 int head[MAXN],p,dist[MAXN],cnt[MAXN];13 queue<i 阅读全文
摘要:
SPFA:bfs形式超时,各种优化还是超时,手敲循环队列还超,伤不起啊,有木有我必须晒晒代码,以泄我愤。slfView Code 1 #include <stdio.h> 2 #include <queue> 3 using std::deque; 4 #define MAXN 150010 5 #define MAX 30010 6 #define INF (1<<29) 7 int n,m; 8 deque <int> q; 9 struct node10 {11 int d,t;12 node* next;13 }*h1[MAX],e1[M 阅读全文
摘要:
dijkstra简单变形,单目标和单源最短路的结合。poj1511类似View Code 1 #include <stdio.h> 2 #define MAXN 100010 3 #define MAX 1010 4 #define INF (1<<29) 5 int n,m,x; 6 struct node 7 { 8 int d,t; 9 node* next;10 }*h1[MAX],e1[MAXN],*p,*h2[MAX],e2[MAXN],*q;11 bool v[MAX];12 int t[MAX],sum,max[MAX];13 void input()1 阅读全文
摘要:
floyd水题,将map[i][j]理解为从i到j的路径中高度最小即可,将松弛条件改为map[i][j]=MIN(map[i][j],MAX(map[i][k],map[k][j]));好好理解一下吧View Code 1 #include <stdio.h> 2 #include <string.h> 3 #define MAXN 310 4 #define INF (1<<29) 5 #define MIN(a,b) ((a)<(b)?(a):(b)) 6 #define MAX(a,b) ((a)>(b)?(a):(b)) 7 int n, 阅读全文
摘要:
额,应该是一道水题,只要搞清楚想要知道一只牛在什么等级就要和所有的牛都比较过也就是可以从这只牛到所有牛,那么就问题就转化为传递闭包。View Code 1 #include <stdio.h> 2 #include <string.h> 3 #define MAXN 101 4 bool map[MAXN][MAXN]; 5 int n,m; 6 void floyd() 7 { 8 for(int k=1;k<=n;++k) 9 for(int i=1;i<=n;++i)10 for(int j=1;j<=n;++j)11 ... 阅读全文
摘要:
好吧,我承认我水了一道题,除边计算较麻烦外。。。。==裸地dijkstraView Code 1 #include <stdio.h> 2 #include <math.h> 3 #define MAXN 210 4 #define INF (1<<29) 5 double map[MAXN][MAXN]; 6 double dist[MAXN]; 7 bool v[MAXN]; 8 int cnt; 9 struct node10 {11 double x,y;12 }p[MAXN];13 double lenth(node a,node b)14 {15 阅读全文
摘要:
本人一直比较愚钝,所以做题之时只有多花时间,此题是dijkstra变形,网上较多代码却少有解释为什么,我为何我一样的菜鸟来解释一下吧。首先你要明白dijkstra之所以能用贪心的原因,不明者可以看dijkstra,bellman-ford,floyd分析比较也就是dist[i]在证明中表示原点到i的最短路径,显然此题的dist表示原点到i的路径中最大载重量,为什么dist也可以表示?,当dist[i]被选中时不会改变了吗?它就是最大载重吗?如s->t最大载重是10,s->i->t最大载重是20,可能是t在i之前被选中吗?答案是不可能,若s->i->t最大载重是20 阅读全文
摘要:
此题结合了最短路经典变形,即将图边反向,再用单元最短路即单目标最短路,题解就是单元最短路和单目标最短路之和。有负权不可用dijkstra,看数据量和时间bellman-ford可能超时,事实证明有可能不超,用SPFA,又加了点优化用SLF。View Code 1 #include <queue> 2 #include <stdio.h> 3 #include <string.h> 4 using std::deque; 5 #define MAXN 1000010 6 #define INF (1<<30) 7 deque <int> 阅读全文