POJ 1201 Intervals (差分约束,SPFA)
摘要:饿。。思路和实现方法与POJ 1716完全一样。。。但根据北大那本图论书,此题应该有更加优化的建图和约束的方法,因此先丢垃圾桶。。。#include <stdio.h>#include <string.h>#define maxn 150010#define inf 1000000000int head[maxn], pnt[maxn], length[maxn], next[maxn];int tot;int dist[maxn];int queue[10000000];int inq[maxn];int countq[maxn];int n;int a,b,len;
阅读全文
POJ 1716 Integer Intervals (差分约束,SPFA)
摘要:建模方法:用数组dist[i]表示从点0到点i-1所包含的关键点的数目;输入数据即可转化为:dist[b+1]-dist[a]>=2 => dist[a]-dist[b+1]<=-2根据实际情况还有两个约束条件:dist[i+1]-dist[i]<=1dist[i+1]-dist[i]>=0 => dist[i]-dist[i]+1<=0于是可以建图,SPFA。最后输出dist[max]-dist[min]即可(max与min 为输入数据出现的最大点和最小点)#include <stdio.h>#include <string.h&g
阅读全文
POJ 3169 Layout (差分约束系统,SPFA)
摘要:第一次做差分约束系统,关键在于建模。此题的建模很简单, 喜欢:d[j]-d[i]<=len 不喜欢:d[j]-d[i]>=len => d[i]-d[j]<=-len代码:#include <stdio.h>#include <string.h>#define maxn 1010#define maxm 10010#define inf 1000000000int head[maxn], pnt[maxm], length[maxm], next[maxm];int tot;int dist[maxn];int queue[maxn*maxn];
阅读全文
POJ 3259 Wormholes (SPFA)
摘要:这题调了有24小时。。。重写了N遍。。。最后被别人发现是数组开小了。。。= =。。。算了,,全当练习手速了。。。思路:利用SPFA判断是否存在负圈题目描述与实际数据不大相符,按照题目描述应当是从任意点出发的连通分支是否存在负圈,而实际上只要判断从第一个点出发是否构成负圈就足够了。。可能是数据强度不够。。#include <stdio.h>#include <string.h>#define MAXN 1025#define inf 100000000int head[MAXN],next[MAXN*MAXN],pnt[MAXN*MAXN],length[MAXN*MAX
阅读全文
POJ 1511 Invitation Cards (SPFA)
摘要:这题思路和POJ 3268 是基本一样的,但数据规模很大,应当做如下处理:数组要开大SPFA若不用循环队列则队列要到10的七次方才比较稳妥储存权值的空间要开成LONG LONG就可以过了。#include <stdio.h>#include <string.h>#define MAXN 1000000#define MAXM MAXN#define inf 1000000000000000000 //18int head[2][MAXN], pnt[2][MAXM], next[2][MAXM];long long length[2][MAXM];int tot[2];
阅读全文
POJ 3268 Silver Cow Party (SPFA)
摘要:存两个图,一正一反,用SPFA求X点的单元最短路,正反两个DIST之和的最大值即为答案。#include <stdio.h>#include <string.h>#define MAXN 1010#define MAXM MAXN*MAXN#define inf 1000000000int head[2][MAXN], pnt[2][MAXM], length[2][MAXM], next[2][MAXM];int tot[2];int dist[2][MAXN];int queue[MAXM];int inq[MAXN];int countq[MAXN];int n,
阅读全文
POJ 2240 Arbitrage (BELLMAN-FORD)
摘要:思路:用BELLMAN-FORD算法求从源点SRC出发到各个顶点V(包括SRC本身)的最长路径长度,这里路径长度不是权值之和,而是权值乘积。代码:#include <stdio.h>#include <string.h>#define inf 1000000#define MAXN 35int n,m,a,b;char hash[MAXN][100];double edge[MAXN][MAXN];char str1[100],str2[100];double len;double dist[MAXN];int flag;int hex(char str[]){ for
阅读全文
学习小结——SPFA
摘要:今天看了下SPFA算法,写了个模板。。。真是神物啊。。。理论上O(m)的复杂度下界。。。竟然能达到O(km)的程度。。。#include <stdio.h>#include <string.h>#define MAXN 100#define inf 100000000int head[MAXN],pnt[MAXN*MAXN],next[MAXN*MAXN],length[MAXN*MAXN];int dist[MAXN],prev[MAXN];int inqueue[MAXN];int queue[2*MAXN];int n;int a,b,len;int tot;vo
阅读全文
POJ 2394 Checking an Alibi (dijkstra)
摘要:呃。。。帮别人改的代码。。。顺便就过了。。风格不是我的。。#include <stdio.h>#include <string.h>#define MAX 1000000000#define MAXN 1010int f,p,c,m,toil=1;int pnt[MAXN*MAXN],next[MAXN*MAXN],head[MAXN*MAXN],len[MAXN*MAXN];int cow[MAXN],dist[MAXN],used[MAXN];int count,min,minp;void addedge(int u,int v,int w){ pnt[toil]=
阅读全文
学习小结——BELLMAN-FORD
摘要:昨天讲了差分约束系统。。发现自己连BELLMAN-FORD都还不会。。。今天看书 尝试搞了一个。。自己设计的小数据运行无误。。#include <stdio.h>#define inf 1000000000#define MAXN 8int edge[MAXN][MAXN];int dist[MAXN];int prev[MAXN];int n;int m;void addedge(int a, int b, int len){ edge[a][b]=len;}void bf(int src){// for (int i=0; i<n; i++) {// dist[i]=ed
阅读全文
HDU 3834 EARTH HOUR(DIJKSTRA)
摘要:思路:建图(只要联通,边长即为1)对0、1、2三个顶点用3次DIJKSTRA即可解决。代码:#include <stdio.h>#include <string.h>#include <math.h>#define MAXN 210#define inf 1000000000int head[MAXN], pnt[MAXN*MAXN], next[MAXN*MAXN];int tot;int used[3][MAXN];double dist[3][MAXN];struct Tpoint { double x; double y; double r;}poi
阅读全文
POJ 2253 Frogger (DIJKSTRA)
摘要:修改条件的DIJKSTRA。。。这都搞了一下午。。。郁闷了。。。松弛条件修改为:dist[i]=max(dist[minp],edge[minp][i]) (dist用来记录构成路径的最短边集合中的最长边(很绕口啊。。。公认的))还有 要注意边界处理 先把dist[i]设置为edge[0][i]呃。。大概就这么多。。好久不写最短路了。。缺乏练习啊。。#include <stdio.h>#include <string.h>#include <math.h>#define MAXN 210#define inf 1000000000struct Tpoint
阅读全文