2011年7月24日

摘要: 这题调了有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 阅读全文
posted @ 2011-07-24 00:42 Eucalyptus 阅读(405) 评论(0) 推荐(0) 编辑

2011年7月23日

摘要: 这题思路和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]; 阅读全文
posted @ 2011-07-23 22:34 Eucalyptus 阅读(198) 评论(0) 推荐(0) 编辑
摘要: 存两个图,一正一反,用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, 阅读全文
posted @ 2011-07-23 22:00 Eucalyptus 阅读(177) 评论(0) 推荐(0) 编辑
摘要: 思路:用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 阅读全文
posted @ 2011-07-23 03:05 Eucalyptus 阅读(303) 评论(0) 推荐(0) 编辑
摘要: 今天看了下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 阅读全文
posted @ 2011-07-23 00:08 Eucalyptus 阅读(183) 评论(0) 推荐(0) 编辑

2011年7月21日

摘要: 呃。。。帮别人改的代码。。。顺便就过了。。风格不是我的。。#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]= 阅读全文
posted @ 2011-07-21 22:29 Eucalyptus 阅读(228) 评论(0) 推荐(0) 编辑
摘要: 昨天讲了差分约束系统。。发现自己连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 阅读全文
posted @ 2011-07-21 16:54 Eucalyptus 阅读(153) 评论(0) 推荐(0) 编辑

2011年7月20日

摘要: 一开始以为是POJ 2299 的翻版,归并排序求逆序数于是写出了以下的超时代码:#include <stdio.h>#define inf 1000000000int n;int a[10010];int minnixu;int nixu;int num[10010];int bak[10010];void mergesort (int L, int R){ if (L >= R) return; int mid = (L + R) / 2; mergesort (L, mid); mergesort (mid + 1, R); for (int k = L; k <= 阅读全文
posted @ 2011-07-20 15:31 Eucalyptus 阅读(261) 评论(0) 推荐(0) 编辑
摘要: 纯水。#include <stdio.h>int n;int num;int tot;int print[10010];int main(){ while (~scanf("%d",&n)) { tot=0; for(int i=1; i<=n; i++) { scanf("%d",&num); if(num==i) print[tot++]=i; } if(tot==0) printf("No Mistake\n"); else { for(int i=0; i<tot-1; i++) { p 阅读全文
posted @ 2011-07-20 14:56 Eucalyptus 阅读(176) 评论(0) 推荐(0) 编辑
摘要: 思路:建图(只要联通,边长即为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 阅读全文
posted @ 2011-07-20 14:23 Eucalyptus 阅读(289) 评论(0) 推荐(0) 编辑