随笔分类 -  图论

摘要:使用了书上讲的迭代加深搜索,假设删除一个点,两个点,三个点。。。每次都先找最短路径再枚举最短路径上的点删除,dfs实现,A的很顺利,呵呵。。View Code 1 #include<stdio.h> 2 #include<string.h> 3 int n,m,k; 4 int tot; 5 bool goal; 6 int fa[60]; 7 bool flag[60]; 8 int d[50][100]; 9 int head[60];10 int Q[10000];11 struct node12 {13 int t,next;14 }edge[10005];15 阅读全文
posted @ 2011-11-01 21:03 Because Of You 阅读(480) 评论(4) 推荐(0) 编辑
摘要:开始的时候二分的地方写错了,一直找不出错,搜搜别人的题解,一对比就知道了每次输入的是一对点,只能在其中选一个点画圆,然后二分枚举半径,把不矛盾的点连一条边,建好图后,判断强连通是否有解即可,即会不会有某一对点属于同一个强连通分量中,如果都不会,则半径合法View Code 1 #include<stdio.h> 2 #include<string.h> 3 #include<vector> 4 #include<math.h> 5 #include<algorithm> 6 using namespace std; 7 const i 阅读全文
posted @ 2011-10-29 20:48 Because Of You 阅读(382) 评论(0) 推荐(0) 编辑
摘要:感觉建图复杂度过大啊,但还是AC了。。。View Code 1 #include<stdio.h> 2 #include<string.h> 3 char str[210][1010]; 4 int map[210][210]; 5 int min(int a,int b){return a<b?a:b;} 6 const int inf = 9999999; 7 int n,match[210]; 8 bool sx[210],sy[210]; 9 int lx[210],ly[210]; 10 bool path(int u) 11 { 12 sx[u]=tr 阅读全文
posted @ 2011-10-28 20:18 Because Of You 阅读(286) 评论(0) 推荐(0) 编辑
摘要:比如第i个学生是 【a b】那就从i向a至b连边左边是学生,右边是排名二分匹配即可View Code 1 #include<stdio.h> 2 #include<string.h> 3 int map[62][100001]; 4 int match[100010]; 5 bool vis[100010]; 6 int mi,mx; 7 bool dfs(int u) 8 { 9 int i;10 for(i=mi;i<=mx;i++)11 {12 if(map[u][i]&&!vis[i])13 {14 vi... 阅读全文
posted @ 2011-10-28 18:50 Because Of You 阅读(292) 评论(0) 推荐(0) 编辑
摘要:表示原来用RMQ和LCA做的方法烦了,现在直接在建最小生成树的过程中建双向边就好了, cost[i][j]表示i到j的最长树边View Code 1 #include<string.h> 2 #include<stdio.h> 3 #include<vector> 4 #include<math.h> 5 #include<queue> 6 using namespace std; 7 const int M =1010; 8 const double inf = 1e20; 9 double max(double a,double 阅读全文
posted @ 2011-10-25 22:02 Because Of You 阅读(285) 评论(0) 推荐(0) 编辑
摘要:以前的写法太挫了,现在改了一下,精简了View Code #include<stdio.h> #include<string.h> const int MAX = 10010; #define fi(a, b, c) for(int a = (b) ; a < (c) ; a++) #define FI(a, b, c) for(int a = (b) ; a <= (c) ; a++) #define fe(a,b) for(int a=(b); a; a = nxt[a]) int f[MAX],nxt[2*MAX],pnt[2*MAX],h[MAX], 阅读全文
posted @ 2011-10-24 16:37 Because Of You 阅读(288) 评论(0) 推荐(0) 编辑
摘要://图的三连通的判断//在图中删去一个点,判断是否存在割点,以及判断图是否连通#include<stdio.h>#include<string.h>#include<vector>using namespace std;const int MAX = 1010;vector<int> edge[MAX];int low[MAX],dfn[MAX];int vis[MAX];int n,m,tdfn;bool flag=0;int root;inline int min(int a,int b){return a<b?a:b;}void df 阅读全文
posted @ 2011-10-20 11:41 Because Of You 阅读(801) 评论(0) 推荐(0) 编辑
摘要:这道题目调了n久,最后终于攻克了,赞一个图论题目,模板要高度可靠题意抽象:要完成两个任务1:最少从几个点开始遍历就能遍历所有的点,即求缩点后入度为零的点的个数如果不缩点,举个例子:有两个环,没有点入度为0,但是还是需要分别从两个环中的点开始遍历,所以要先缩点2、最少需要连几条边,图就变成强连通了,即把入度为0 和出度为0的点都连起来,相当于把一棵树的叶子和根连起来,最少需要连的边数为出度为0的连通块数的入度为0的连通块数的较大值(应该很容易想的)另外,需要注意一个地方,就是原图可能就是强连通,缩点后就只有一个点了,入度出度均为0,所以要特判一下#include<stdio.h>#i 阅读全文
posted @ 2011-10-19 21:43 Because Of You 阅读(240) 评论(0) 推荐(0) 编辑
摘要:#include<stdio.h>#include<string.h>#include<vector>#include<algorithm>using namespace std;const int MAX = 10010;vector<int> edge[MAX];int st[MAX];int dfn[MAX],low[MAX];int top,btype,tdfn;//btype:连通块的个数int belong[MAX];//点属于哪个连通块bool ins[MAX];void dfs(int s){ int i,t; dfn 阅读全文
posted @ 2011-10-19 18:30 Because Of You 阅读(237) 评论(0) 推荐(0) 编辑
摘要:搜索双连通分量。深度优先搜索过程中,用一个栈保存所有经过的节点,判断割点,碰到割点就标记当前栈顶的结点并退栈,直到当前结点停止并标记当前割点。标记过的结点处于同一个双连通分量。交叉染色搜索奇圈。在一个节点大于2的双连通分量中,必定存在一个圈经过该连通分量的所有结点;如果这个圈是奇圈,则该连通分量内的所有的点都满足条件;若这个圈是偶圈,如果包含奇圈,则必定还有一个奇圈经过所有剩下的点。因此一个双连通分量中只要存在一个奇圈,那么该双联通分量内的所有的点都处于一个奇圈中,在题目中,即武士可以坐成一圈。根据这个性质,只需要在一个双联通分量内找奇圈即可判断该双联通分量是否满足条件。交叉染色法就是在dfs 阅读全文
posted @ 2011-10-19 17:34 Because Of You 阅读(578) 评论(1) 推荐(0) 编辑
摘要://缩点后必须只有一个点的出度为0,此连通块中的点才被所有的牛仰慕//poj 2186#include<stdio.h>#include<string.h>#include<vector>#include<algorithm>using namespace std;const int MAX = 10010;vector<int> edge[MAX];int st[MAX];int dfn[MAX],low[MAX];int top,btype,tdfn;//btype:连通块的个数int belong[MAX];//点属于哪个连通块 阅读全文
posted @ 2011-10-19 17:00 Because Of You 阅读(200) 评论(0) 推荐(0) 编辑
摘要:建图过程,上面一行字母与下面一行一一对应连边,再利用KM求一个最优匹配即可#include<stdio.h>#include<string.h>#include<string>#include<vector>#include<stdlib.h>using namespace std;#define MIN(a,b) a<b?a:b#define INF 999999#define MAX 50int match[MAX];bool sx[MAX],sy[MAX];int lx[MAX],ly[MAX],map[MAX][MAX] 阅读全文
posted @ 2011-10-18 19:28 Because Of You 阅读(495) 评论(0) 推荐(0) 编辑
摘要:终极模板View Code #include<stdio.h>#include<string.h>#include<algorithm>using namespace std;const int N = 10010;const int M = 100010;int min(int a,int b){ return a>b?b:a;}struct EDGE{ int to,next,id;}edge[2*M];int n,m,tot,tdfn,nbridge;int head[N],vis[N],low[N],dfn[N],bridge[M];void 阅读全文
posted @ 2011-10-13 09:09 Because Of You 阅读(292) 评论(0) 推荐(0) 编辑
摘要:注意,初始化时当期时间戳就设为1在这里没错,但在poj1144就会错所以我改了改,初始化时就设为0了求割点的思想图论书上介绍的很详细了,推荐北京大学出版社出版的《图论算法理论、实现及其应用》View Code #include<stdio.h>#include<string.h>#define bug() {puts("bugbug");} const int M = 1010;int dfn[M],low[M];int head[1010];struct node{ int v; int next;}edge[100];int subnet[M]; 阅读全文
posted @ 2011-10-10 12:35 Because Of You 阅读(268) 评论(0) 推荐(0) 编辑
摘要:求割点数很简单难在一些细节到现在还不清楚为什么一开始就设置dfn为1为什么会错错误的代码View Code #include<stdio.h>#include<string.h>int n,son,ans;int map[1000][1000];int dfn[1000],low[1000];int vis[1000];int tdfn;int flag[1000];int min(int a,int b){ return a<b?a:b;}void dfs(int u){ int v; for(v=1;v<=n;v++){ if(map[u][v]){ . 阅读全文
posted @ 2011-10-10 12:19 Because Of You 阅读(269) 评论(0) 推荐(0) 编辑
摘要:蛮2巧妙的思路,有点被标记了,才去更新这个点所能更新的最短路径,;此时要利用floyd的思想View Code #include<stdio.h>#include<string.h>const int INF = 999999999;int n,m,q;int map[310][310];int vis[310];void floyd(int x){ int i,j; for(i=0;i<n;i++) for(j=0;j<n;j++) if(map[i][x]+map[x][j]<map[i][j]) map[i][j]= map[i]... 阅读全文
posted @ 2011-10-06 17:33 Because Of You 阅读(335) 评论(0) 推荐(0) 编辑
摘要:题目意思,可以从A走到B当且仅当B到终点的最短路径小于A到终点的最短路径问一共存在几条这样的路径我用dijkstra各做了一遍,呵呵个中细节还需细细体味啊View Code #include<stdio.h>#include<queue>#include<string.h>using namespace std;const int INF = 9999999;struct NODE{ int v,w; int next;}list[10000000];int tot;int head[1010];int dis[1010];int vis[1010];int 阅读全文
posted @ 2011-09-26 15:19 Because Of You 阅读(273) 评论(0) 推荐(0) 编辑
摘要:一个人的旅行Time Limit : 1000/1000ms (Java/Other)Memory Limit : 32768/32768K (Java/Other)Total Submission(s) : 28Accepted Submission(s) : 7Font: Times New Roman | Verdana | GeorgiaFont Size: ← →Problem Description虽然草儿是个路痴(就是在杭电待了一年多,居然还会在校园里迷路的人,汗~),但是草儿仍然很喜欢旅行,因为在旅途中 会遇见很多人(白马王子,^0^),很多事,还能丰富自己的阅历,还可以看美丽 阅读全文
posted @ 2011-09-26 12:26 Because Of You 阅读(427) 评论(0) 推荐(0) 编辑
摘要:View Code #include<stdio.h>#include<string.h>int map[105][105];int main(){ int n,m,a,b; int i,j,k; scanf("%d%d",&n,&m); memset(map,0,sizeof(map)); for(i=0;i<m;i++) { scanf("%d%d",&a,&b); map[a][b]=1; } for(k=1;k<=n;k++) for(i=1;i<=n;i++) for(j 阅读全文
posted @ 2011-09-16 15:51 Because Of You 阅读(144) 评论(0) 推荐(0) 编辑
摘要:View Code #include<stdio.h>#include<string.h>#define MAXN 101000#define INF 2000000struct NODE{ int v; int w; NODE *next;}edge[MAXN],redge[MAXN],temp[MAXN*2];int pos=0;int ecost[MAXN];int N,M,W,s,Q[MAXN];bool vis[MAXN];void spfa(int dir)//0为正向,1为反向{ int head,rear,u,i; NODE*ptr; hea... 阅读全文
posted @ 2011-09-16 15:32 Because Of You 阅读(178) 评论(0) 推荐(0) 编辑