摘要: 题目大意:给定一个无向连通图,求至少需添加几条边,使得原图双连通(不存在桥)。分析:用tarjan算法找桥,将所有不是桥的边的端点用并查集合并,这题以前写过,至于为什么可以用并查集来合并,可以参考以前那篇博客。需要注意的是,数据中有重边,在判桥时要注意。可以用一个矩阵存储边的数目,若某边数目大于1,则一定不是桥。View Code #include <stdio.h>#include <string.h>#define MIN(a,b) ((a)<(b)?(a):(b))#define N 1001#define M 2002int n,m,e;int g[N][ 阅读全文
posted @ 2012-07-26 22:48 BeatLJ 阅读(201) 评论(0) 推荐(0)
摘要: 题意:求一个有向图中所有满足以下性质的结点:从自身出发可达的点均能回到自身。分析:求的就是缩点后出度为0的强连通分量内的点。这题以前写过,当时用邻接表来存储的。今天又试了下矩阵存储,速度慢了一半……用矩阵存储时,要用char或bool,否则会超内存。View Code #include <stdio.h>#include <string.h>#define N 5001int n,m;char g[N][N],vis[N];int dfn[N],id[N],cnt;int dout[N];void dfs(int u){ vis[u]=1; for(int v=1;v& 阅读全文
posted @ 2012-07-26 21:10 BeatLJ 阅读(198) 评论(0) 推荐(0)
摘要: 题目大意:有n个牛,已知这些牛之间的崇拜关系,崇拜关系是可以传递的,例如:a崇拜b,b崇拜c,那么a崇拜c。问有多少牛被其他所有牛崇拜?分析:根据崇拜关系建立有向图,已知同属于一个强连通分量的牛互相崇拜,通过求强连通缩点后,若出度为0的点只有一个,那么这一群牛就被其他所有牛崇拜,否则不存在被其他所有牛崇拜的牛。View Code #include <stdio.h>#include <string.h>#define N 10001#define M 50001int first[N],next[M],v[M];int rfirst[N],rnext[M],rv[M]; 阅读全文
posted @ 2012-07-26 20:17 BeatLJ 阅读(207) 评论(0) 推荐(0)
摘要: 题目大意:有n个学生和p门课程,每个学生选修了p门课程中的一些,问能否找到p个课代表,一个人最多只能当一门课的课代表。分析:建立二分图,求最大匹配,判断最大匹配数目是否为pView Code #include <stdio.h>#include <string.h>#define N 301int g[N][N];int x[N],y[N],vis[N];int p,n;int path(int u){ int v; for(v=1;v<=p;v++) if(!vis[v]&&g[u][v]) { vis[v]=1; if(y[v]==-1 |.. 阅读全文
posted @ 2012-07-26 17:25 BeatLJ 阅读(155) 评论(0) 推荐(0)
摘要: DescriptionN个学校之间有单向的网络,每个学校得到一套软件后,可以通过单向网络向周边的学校传输。问题1:初始至少需要向多少个学校发放软件,使得网络内所有的学校最终都能得到软件。问题2:至少需要添加几条传输线路(边),使任意向一个学校发放软件后,经过若干次传送,网络内所有的学校最终都能得到软件。Input输入有多组样例,大约1000组。每组样例第一行包含两个整数N,M(2<=N<=100),N代表学校的个数,M代表边的个数(M<N*N)接下来M行,每行包含连个整数u,v,代表u可以向v单向发送数据。Output每组样例对应两行,分别是问题一和问题二的解。Sample 阅读全文
posted @ 2012-07-26 17:19 BeatLJ 阅读(193) 评论(0) 推荐(0)