2013年2月27日
摘要:
题目链接。分析:本题的关键的关键是——看懂题。。。本质就是求该图是否存在负环。也就是如何求出一个图是否含有负环。要注意的是输入该题中的path是双向的,wormhole是单向的。Bellman_Ford:View Code 1 #include <stdio.h> 2 3 #define MAXN 520 4 #define MAXM 6000 5 6 const int INF = (1<<26); 7 8 struct node{ 9 int u, v, w;10 }edge[MAXM];11 12 int dis[MAXN], top;13 14 int bell
阅读全文
posted @ 2013-02-27 20:01
Still_Raining
阅读(2218)
推荐(0)
摘要:
题目链接。分析:本题只要考虑重边的问题,基本上就没其它问题了。#include <stdio.h>#define MAXN 202const int INF = (1<<26);int dis[MAXN], G[MAXN][MAXN], vis[MAXN];void Init(int n){ int i, j; for(i=0; i<n; i++){ vis[i] = 0; } for(i=0; i<n; i++){ for(j=0; j<n; j++){ G[i][j] = INF; } }}voi...
阅读全文
posted @ 2013-02-27 19:53
Still_Raining
阅读(187)
推荐(0)
2013年2月26日
摘要:
题目链接。分析:我使用结构的是边表。1.因为只有满足偏序关系才能应用拓扑排序(即u>v要改成v<=u),所以在建立临边时要注意。2.在拓扑排序过程中,如果发现环,那么结果便是No。3.至于每个点的具体值,我用了一个一维数组vis来辅助标记。AC代码如下:#include <stdio.h>#include <string.h>#define MAXN 10010#define MAXM 20010struct node{ int to; int next;}node[MAXM];int head[MAXN], top, n, m, indegree[MAXN
阅读全文
posted @ 2013-02-26 21:17
Still_Raining
阅读(261)
推荐(0)
摘要:
题目连接。分析:想了很多很多。全部WA了。。没想到是找入度为0的点。。如果个数为1个Yes,否则No。。(因为这题仅仅是找冠军而已)#include <stdio.h>#include <string.h>#define MAXN 1005int n, top_name, indegree[MAXN];char name[MAXN][15];void Init(){ top_name = 0; memset(indegree, 0, sizeof(indegree));}int find_str(char *s){ int i; for(i=0; i<top_na
阅读全文
posted @ 2013-02-26 21:01
Still_Raining
阅读(914)
推荐(0)
2013年2月25日
摘要:
题目链接。分析:首先,感慨一下。。我竟然做出来了一个难度为2的(第一次)。。感谢CCTV。这题呢。。直接DFS就可以了。不过不剪枝的话TLE。第一种剪枝是如果所有可走的点的总和也小于T直接输出NO。这一种剪枝可以从TLE到843ms第二种是从课件上学的奇偶性剪枝可以从TLE到 453ms最后把两种方法合并。竟然达到了62ms(掌声响起。。)奇偶性剪枝。如下图所说。62ms AC代码如下;#include <stdio.h>#include <string.h>#include <math.h>#include <stdlib.h>#define
阅读全文
posted @ 2013-02-25 21:32
Still_Raining
阅读(224)
推荐(0)
摘要:
题目链接。分析:一看这题还以为是暴搜呢。果断TLE。第二次将三个数组合并,二分查找,MLE。最后将两个两个数组合并,二分查找 AC。。。不容易啊。AC代码如下:#include <stdio.h>#include <stdlib.h>#define MAXN 510int l, m, n;int num1[MAXN], num2[MAXN], num3[MAXN], num4[MAXN*MAXN];int cmp(const void *a, const void *b){ return *(int *)a - *(int *)b;}int main(){ int fl
阅读全文
posted @ 2013-02-25 17:34
Still_Raining
阅读(156)
推荐(0)
摘要:
题目链接。分析:先求出素数表。再DFS。#include <stdio.h>#include <string.h>#define MAXN 21int isp[MAXN+MAXN], num[MAXN], n, vis[MAXN], cnt;void prime(){ int i, j; memset(isp, -1, sizeof(isp)); isp[0] = isp[1] = 0; for(i=2; i<=MAXN+MAXN; i++){ if(isp[i]) for(j=i*i; j<=MAXN+MAXN; j += i) ...
阅读全文
posted @ 2013-02-25 17:26
Still_Raining
阅读(175)
推荐(0)
摘要:
题目链接。这题就是BFS。也挺水的。。看见这个时间差了吗。。很可惜。这并不是减枝。。只是同样的代码,用不同的编译器发罢了(汗。)。#include <stdio.h>#define MAXN 52typedef struct Pos{ int x, y, z; int cur;}Pos;int a, b, c;int G[MAXN][MAXN][MAXN], vis[MAXN][MAXN][MAXN];Pos queue[MAXN*MAXN*MAXN];int dx[] = {0, 0, 0, 0, 1, -1};int dy[] = {0, 0, 1, -1, 0, 0};int
阅读全文
posted @ 2013-02-25 17:19
Still_Raining
阅读(286)
推荐(0)
摘要:
题目链接。分析:水题,直接BFS或者DFS。dfs:#include <stdio.h>#include <stdlib.h>#include <string.h>#define MAXN 22char G[MAXN][MAXN];int vis[MAXN][MAXN], cnt, m, n;int dx[4] = {0, 0, 1, -1};int dy[4] = {1, -1, 0, 0};void dfs(int x, int y){ int d; for(d=0; d<4; d++){ int nx = x+dx[d], ny = y+dy[d
阅读全文
posted @ 2013-02-25 16:37
Still_Raining
阅读(487)
推荐(0)
2013年2月24日
摘要:
题目链接。分析:水题,简单DP。经过这么几天的努力,回头再看这些曾经被认为是“难题”的题, 确实感觉到了自己的进步。。但,进步永不会停止。#include <stdio.h>#include <stdlib.h>#include <string.h>#define MAXN 35int dp[MAXN];int main(){ int n, m, i, j; while(scanf("%d %d", &n, &m) == 2 && (n != 0 || m != 0)){ memset(dp, 0, siz
阅读全文
posted @ 2013-02-24 16:25
Still_Raining
阅读(191)
推荐(0)
摘要:
题目链接。分析:n个点,m条边,每条边仅且经过两次,输出路径。题目保证了必然存在一条这样的边,那么直接dfs搜索,搜索的时候把next标记下就可以了。不过虽然参考别人的过了,还是遇到很多问题,要仔细琢磨琢磨了。#include <stdio.h>#define MAXN 10010#define MAXM 100010struct node{ int to; int next;}edge[MAXM];int head[MAXN], t, vis[MAXM];void Init(int n, int m){ int i; t = 0; for(i=1; i<=n; ...
阅读全文
posted @ 2013-02-24 10:46
Still_Raining
阅读(208)
推荐(0)
2013年2月23日
摘要:
题目地址。分析:1.图必须是连通的。2.欧拉道路或者是欧拉回路都是可以的。#include <stdio.h>#include <stdlib.h>#include <string.h>#define MAXN 27int hash[MAXN], in[MAXN], out[MAXN], p[MAXN];void Init(){ int i; for(i=0; i<MAXN; i++){ hash[i] = in[i] = out[i] = 0; p[i] = i; }}int find(int x){return p[x] == x ? x : ..
阅读全文
posted @ 2013-02-23 20:35
Still_Raining
阅读(302)
推荐(0)
2013年2月22日
摘要:
题目地址。解题报告:欧拉回路:图G,若存在一条路,经过G中每条边有且仅有一次,称这条路为欧拉路,如果存在一条回路经过G每条边有且仅有一次,称这条回路为欧拉回路。具有欧拉回路的图成为欧拉图。判断欧拉路是否存在的方法有向图:图连通,有一个顶点出度大入度1,有一个顶点入度大出度1,其余都是出度=入度。无向图:图连通,只有两个顶点是奇数度,其余都是偶数度的。判断欧拉回路是否存在的方法有向图:图连通,所有的顶点出度=入度。无向图:图连通,所有顶点都是偶数度。本题呢。先用并查集查看共有几棵树, 记录下每棵树中度为奇数的点的个数。 如果该树中度为奇数的点的个数为0, 且代表元的度为0,证明该点为孤立的点,按
阅读全文
posted @ 2013-02-22 21:35
Still_Raining
阅读(271)
推荐(0)
摘要:
之前总结过一次。详见本博客或者是另一篇。不过呢。写起来。还是今天的简单易写(学长教的)。测试数据my.txt.邻接矩阵:#include <stdio.h>#include <stdlib.h>#include <string.h>#define MAXN 100const int INF = (1<<23);int G[MAXN][MAXN];int main(){ //freopen("d:\\my.txt", "r", stdin); int n, m, i, j, u, v, w; scanf(&q
阅读全文
posted @ 2013-02-22 10:37
Still_Raining
阅读(1271)
推荐(0)
摘要:
摘自百度百科:设两数为a、b(b<a),用gcd(a,b)表示a,b的最大公约数,r=a mod b 为a除以b以后的余数,k为a除以b的商,即a÷b=k.......r。辗转相除法即是要证明gcd(a,b)=gcd(b,r)。第一步:令c=gcd(a,b),则设a=mc,b=nc第二步:根据前提可知r =a-kb=mc-knc=(m-kn)c第三步:根据第二步结果可知c也是r的因数第四步:可以断定m-kn与n互素【否则,可设m-kn=xd,n=yd,(d>1),则m=kn+xd=kyd+xd=(ky+x)d,则a=mc=(ky+x)dc,b=nc=ycd,故a与b最大公
阅读全文
posted @ 2013-02-22 08:37
Still_Raining
阅读(260)
推荐(0)
2013年2月21日
摘要:
题目链接。解题报告:首先1.题目上说的房间的编号至少为1,也就是说,当输入只0 0时,要输出Yes。2.在连通两个房间时,如果发现已经间接地连通了,那么结果便是No.3.要保证给出的所有房间之间都必须连通,否则便是No。View Code #include <stdio.h>#include <stdlib.h>#include <string.h>#define MAXN 100010int p[MAXN], ans, v[MAXN], n, flag;void Init(){ n = 0; flag = 1; ans = 0; memset(v, 0,
阅读全文
posted @ 2013-02-21 14:18
Still_Raining
阅读(198)
推荐(0)
摘要:
POJ2524 Ubiquitous ReligionsPOJ1611 The Suspects解题报告:这两个题差不多。就一块发了。。就是赤裸裸的并查集POJ2524Ubiquitous Religions代码如下:View Code #include <stdio.h>#include <stdlib.h>#define MAXN 50010int p[MAXN];int icount;int find_f(int x){return p[x] == x ? x : (p[x]=find_f(p[x]));}int main(){ int n, m, i, a, b
阅读全文
posted @ 2013-02-21 14:10
Still_Raining
阅读(182)
推荐(0)
2013年2月20日
摘要:
题目链接。解题报告:静态分配是比动态分配省时的。静态分配耗时:动态分配耗时:#include <stdio.h>#include <stdlib.h>#include <string.h>#define MAXN 26typedef struct TrieNode{ int flag; struct TrieNode *next[MAXN];}TrieNode;TrieNode mem[500000];int pn;TrieNode *CreateTrieNode(){ TrieNode *p; int i; p = &mem[pn++]; p-&g
阅读全文
posted @ 2013-02-20 21:12
Still_Raining
阅读(339)
推荐(0)
摘要:
题目链接。解题报告:现在假定两个字符串A,B。 A的长度小于B。分两种情况,当B先输入时(即长的先输入),途经的结点的flag如果为1,即如果有小于B的单词,便为前缀。当A先输入时(即短的先输入),当建立到A的最后一个字符时, 如果该结点已存在,那么证明,已有一个以该字符为前缀的字符已经输入。#include <stdio.h>#include <stdlib.h>#include <string.h>#define MAXN 2typedef struct TrieNode{ int flag; struct TrieNode *next[MAXN];}T
阅读全文
posted @ 2013-02-20 20:59
Still_Raining
阅读(425)
推荐(0)
摘要:
题目链接。结题报告:模板题。我用的动态分配内存。。每一组数据操作完都要释放内存。。否则的话。会Memory Limit Exceeded的。#include <stdio.h>#include <stdlib.h>#define MAXN 26typedef struct TrieNode{ int flag; struct TrieNode *next[MAXN];}TrieNode;TrieNode *CreateTrieNode(){ TrieNode *p; int i; p = (TrieNode *)malloc(sizeof(TrieNode)); ...
阅读全文
posted @ 2013-02-20 09:51
Still_Raining
阅读(237)
推荐(0)