摘要: 拓扑排序的裸体,全裸的那种一点变形和要求都没有用DFS来实现//用dfs解决拓扑排序//用一个标记数组vis来标记//0表示还没有访问过,1表示正在访问,2表示已经访问过并且存入拓扑数组#include <stdio.h>#include <string.h>#define MAX 110int g[MAX][MAX],vis[MAX];int n,m,c,top[MAX];int dfs(int u){ int v; vis[u]=1; for(v=1; v<=n; v++) if(g[u][v]) { if(vis[v]==1) return 0; ... 阅读全文
posted @ 2012-10-17 19:13 Titanium 阅读(181) 评论(0) 推荐(1) 编辑
摘要: 拓扑排序入门题,可以用STL来做,这份代码中没有用对于给出的图判断是否为有向无环图(dag),若不是,输出-1其实是按层来处理拓扑序列,算法是先找出入度为0的点,然后删除所有以这些顶点为弧尾的弧,使弧头的入度减1,然后再看下一轮的顶点中那些顶点入度为0,然后依此类推,直到所有点的入度都为0,如果最后结束的时候所有点入度为0,那么是一个dag,否则不是,输出-1,这个过程可以用队列来实现,这个代码里面没有这样做,而是每一层都重新扫描一遍,找出入度为0的顶点(之前已经纳入拓扑序列的顶点就用vis[i]=1来标记),应该用队列实现的话时间会更好另外其中是要构建邻接表的,用数组来构建,当然可以直接用S 阅读全文
posted @ 2012-10-17 18:45 Titanium 阅读(896) 评论(0) 推荐(0) 编辑
摘要: //拓扑排序裸题,题目要求按编号从小到大输出,要换一种思维去思考//按照数据结构课本的算法,建立邻接表,用栈实现。初始化先将入度为0的顶点入栈,然后以栈顶顶点为准,先将栈顶顶点出栈输出它的信息,然后扫描它的邻接表,没找到一个弧头就将其入度减1,减1后判断该弧头是否入度为0,是的话就入栈。直到所有顶点都出栈那么就输出了一个拓扑序列。但是这样做不能保证编号从小到大输出 为了保证从小到大输出,要用“每次都从头来过”的思想,因为题目保证一定存在拓扑序列,所以对于n个点,一定输出n次,所有外循环是次数,找到了n次,输出n个点,然后每次找,都是按照编号从1找到n,所以内循环是对应顶点的编号,从1到n,从当 阅读全文
posted @ 2012-10-16 23:48 Titanium 阅读(184) 评论(0) 推荐(0) 编辑
摘要: 2012-11-23今天复习了一下并查集,然后这道题才发现当时是傻掉了,其实就是并查集找有多少个连通分量,有c个连通分量的话要把他们连起来就需要c-1条边,根本不需要kruskal算法…………………………#include <cstdio>#include <cstring>#define N 1010int p[N];int n,m;int find(int x){ return p[x]==x ? x : p[x]=find(p[x]); }int main(){ while(scanf("%d",&n) && n) { f 阅读全文
posted @ 2012-10-15 18:34 Titanium 阅读(182) 评论(0) 推荐(0) 编辑
摘要: //最小生成树裸题,稠密图,用prim实现不用kruskal#include <stdio.h>#include <string.h>#define MAX 110#define INF 1000*100+10int g[MAX][MAX];int n,m;int lowcoat[MAX],adj[MAX];void Prim(){ int i,j,k,min,ans; for(i=1; i<=n; i++) lowcoat[i]=g[1][i] , adj[i]=1; lowcoat[1]=0; for(i=1; i<n; i++) { ... 阅读全文
posted @ 2012-10-15 17:40 Titanium 阅读(163) 评论(0) 推荐(0) 编辑
摘要: //银行客户平均等候时间//要算等候时间和算逗留时间是不同的//t1[i]表示第i个人的到达时间,t[i]表示第i个人办理时间,t2[i]表示第i个人离开时间,time[i]表示第i个人的等候时间//我们要算平均等候时间,其实就是time数组累加求和然后除以n即可//对于第1个人,他不需要等待,来到就办理,所以等待时间为0//对于第i个人,如果他来到的时候第i-1个人刚刚离开或者已经离开,那么他也不需要等待直接办理,他的情况和第1个人是一样,等待时间为0//即time[i]=0;//如果第i个人来到,但是第i-1个人还没有离开,那么他就要等待,他的等待时间是(第i-1个人的离开时间-第i个人的 阅读全文
posted @ 2012-10-13 00:22 Titanium 阅读(1325) 评论(0) 推荐(0) 编辑
摘要: 最小生成树入门题,和纯粹的裸题有些区别,题目中有些道路已经存在,不需要建造,答案是求最后建造的总费用,不要把已经有的道路的权值算进去//kruskal算法已有的边权植赋为0//用SORT排序,用并查集判断是否成环#include <stdio.h>#include <string.h>#include <algorithm>using namespace std;#define INF 1236343242#define MAX 110bool vis[MAX][MAX];int p[MAX];int ans[MAX*MAX];struct edge{ in 阅读全文
posted @ 2012-10-10 23:42 Titanium 阅读(303) 评论(0) 推荐(0) 编辑
摘要: //DP入门题状态转移方程很容易想到//关键是构建pre数组,多少有点像KMP里面构建的next数组#include <stdio.h>#include <string.h>#define MAX 50100int a[MAX],pre[MAX],dp[MAX];int n;int main(){ int i,j,T,max; scanf("%d",&T); while(T--) { scanf("%d",&n); pre[1]=0; dp[1]=0; ... 阅读全文
posted @ 2012-10-09 22:37 Titanium 阅读(208) 评论(0) 推荐(0) 编辑
摘要: //提交通过,时间0.008,本题主要是字符串处理,以及层序建树,以及前序(DFS递归)//遍历3个知识点,细节问题是字符串的处理,以及空树的处理#include <stdio.h>#include <string.h>#define MAX 40010struct tree{ char data; int l,r; //最左边的孩子下标和最右边的孩子下标 int x,y; //它自身在最开始的字符矩阵中的列和行,x是列,y是行}tree[MAX];char string[210][210];char stack[MAX]; int top,line;void inpu 阅读全文
posted @ 2012-10-05 22:55 Titanium 阅读(224) 评论(0) 推荐(0) 编辑
摘要: //水题,直接模拟#include <stdio.h>#include <string.h>int string[10],x[10],level;int numnode[10]={1,2,4,8,16,32,64,128};char leaf[300];int main(){ int T=0,n,m,i,j,p,q,num,level; char ch,temp[10],ans[300]; while(scanf("%d",&n)!=EOF && n) { getchar(); T++; printf("S-Tree 阅读全文
posted @ 2012-10-05 22:54 Titanium 阅读(217) 评论(0) 推荐(0) 编辑