随笔分类 -  图论

摘要:G++提交又超市了,囧c++就AC了开始没有判重,错了几遍最小生成树简dan题prim和克鲁斯卡尔View Code #include<stdio.h>#include<string.h>#include<algorithm>using namespace std;int n,m,k,p[505],ans;struct node{ int u,v,w;}pt[250000];int cmp(node a,node b){ return a.w<b.w;}int find(int x){return p[x]==x?x:p[x]=find(p[x]);} 阅读全文
posted @ 2011-12-01 16:42 Because Of You 阅读(745) 评论(0) 推荐(0) 编辑
摘要:如果已经建好的公路就直接连一权值为0的边View Code #include<stdio.h>#include<string.h>#define inf 999999int flag[200];int D[200];int map[200][200];int n,i,j;int prime()//下标1开始 { int v,k; int ret=0,mi; for(i=1;i<=n;i++){ flag[i]=0; D[i]=inf; }D[1]=0;flag[1]=1;v=1; for(k=1;k<n;k++){ for... 阅读全文
posted @ 2011-12-01 15:54 Because Of You 阅读(227) 评论(0) 推荐(0) 编辑
摘要:View Code int prime()//下标从1开始 { int i,v,k; int ret=0,mi; for(i=1;i<=n;i++){ flag[i]=0; D[i]=inf; }D[1]=0;flag[1]=1;v=1; for(k=1;k<n;k++){ for(i=1;i<=n;i++)if(!flag[i]){ if(map[v][i]<D[i]) D[i]=map[v][i]; } mi=inf; for... 阅读全文
posted @ 2011-12-01 11:33 Because Of You 阅读(379) 评论(0) 推荐(0) 编辑
摘要:很多的错误,狂交了几十遍,哈哈~最后总结如下:RE:数组越界WA:字母拼错建trie树之后再加一个并查集,用来查询图是否连通以及很方便的记录每个点的度数View Code //runtime error 的原因:初始化的时候从1到MAX赋值,数组越界,牢记啊!!!//WA原因: Impossible拼错。。囧!#include<stdio.h>#include<string.h>#include<stdlib.h>#include<iostream>using namespace std;const int MAX = 500010;class 阅读全文
posted @ 2011-11-29 17:54 Because Of You 阅读(418) 评论(0) 推荐(0) 编辑
摘要:又是神奇的建图题,这道题充分体现了2-sat选了谁必须选谁的性质某一轮如果选了必输的方法,则要连一条边到对立点;即如果选a必输,则连一条边a->a‘总之,要不断找矛盾贴贴很挫的代码View Code #include<stdio.h>#include<string.h>#include<vector>#include<algorithm>using namespace std;const int MAX = 20010;vector<int> edge[MAX];int st[MAX];int dfn[MAX],low[MAX] 阅读全文
posted @ 2011-11-25 15:45 Because Of You 阅读(367) 评论(0) 推荐(0) 编辑
摘要:很奇怪很奇怪的一件事情输入的时候用scanf ("%s%s",s1,s2)竟然错了最后无语的换了下输入,建图不难的#include<stdio.h>#include<string.h>#include<vector>#include<algorithm>using namespace std;const int MAX = 2011;vector<int> edge[MAX];int st[MAX];int dfn[MAX],low[MAX];int top,btype,tdfn;//btype:Á 阅读全文
posted @ 2011-11-25 15:40 Because Of You 阅读(217) 评论(0) 推荐(0) 编辑
摘要:简单二分匹配,注意,输出的是n-最大匹配数#include<stdio.h>#include<string.h>#include<math.h>int match[110];bool map[110][110];struct point{ double x,y;}p[110],hole[110];double dis(point a,point b){ return sqrt((a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y));}bool vis[110];int m;bool dfs(int u){ int i; for(i= 阅读全文
posted @ 2011-11-18 16:17 Because Of You 阅读(259) 评论(1) 推荐(1) 编辑
摘要:其实可以二分的,听说直接输入一扇门的信息,做一次SCC也能爆过,就直接暴力了,呵呵~每个门有两把锁,这就有了一种关系,假设两把锁是a,b,那么不开a就一定要开b,不开b就一定要开a,即b'->a,a'->b;另外还有n对矛盾关系,用了a钥匙就不能用b钥匙,a->b',b->a'然后,强连通求解#include<stdio.h>#include<string.h>#include<vector>#include<algorithm>using namespace std;const int M 阅读全文
posted @ 2011-11-18 15:44 Because Of You 阅读(343) 评论(0) 推荐(0) 编辑
摘要:Let's go homeTime Limit: 10000/1000 MS (Java/Others)Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 693Accepted Submission(s): 220Problem Description小时候,乡愁是一枚小小的邮票,我在这头,母亲在那头。—— 余光中集训是辛苦的,道路是坎坷的,休息还是必须的。经过一段时间的训练,lcy决定让大家回家放松一下,但是训练还是得照常进行,lcy想出了如下回家规定,每一个队(三人一队)或者队长留下或者其余两名队员同时留下; 阅读全文
posted @ 2011-11-17 17:03 Because Of You 阅读(344) 评论(0) 推荐(0) 编辑
摘要:改天把2-sat刷完了再一起总结吧,先放这儿#include<stdio.h>#include<string.h>#include<vector>#include<algorithm>using namespace std;const int MAX =20010;vector<int> edge[MAX];int st[MAX];int dfn[MAX],low[MAX];int top,btype,tdfn;int belong[MAX];bool ins[MAX];void dfs(int s){ int i,t; dfn[s] 阅读全文
posted @ 2011-11-14 21:25 Because Of You 阅读(297) 评论(0) 推荐(0) 编辑
摘要:2-sat入门题,建图后直接模板就好了开始的时候竟然连了双向的边,晕。。。。。#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 阅读全文
posted @ 2011-11-12 23:48 Because Of You 阅读(251) 评论(0) 推荐(0) 编辑
摘要:思想的话看这里http://www.cnblogs.com/lotus3x/archive/2009/03/21/1418480.html二分法:/*the length of the channel is the horizontal distance between the two villages. The cost of the channel is the height of the lifter. 最优比率生成树poj 2728目标:min{∑costi/∑leni}逼近的思想,∑costi/∑leni<=x,即 ∑(costi-x*leni)<=0 是一个单调递减函数 阅读全文
posted @ 2011-11-12 21:21 Because Of You 阅读(886) 评论(1) 推荐(0) 编辑
摘要:一圈的点从0到n-1顺次围起来,题目中给出m条links,要求你把这些link对应的点连起来,问是否存在一种可能使得连完后不存在相交的两条线另外,连线有两种连法,内部相连与外部相连,而且题目保证Every point will have at most one link.很明显的two-sat(虽然做之前已经知道是two-sat了,囧)把每条边看成图中的一个点,如果两条边的区间存在相交,则两条边必然是一内一外才能保证不相交。假如有m条边要连接,则实际可能被连的边有2*m条建图的时候,假设1到m都是在内部的边,m+1到2*m对应外部的边,如果i,j之间区间存在交集,即矛盾了,则必须把 i ,j+ 阅读全文
posted @ 2011-11-11 19:47 Because Of You 阅读(210) 评论(0) 推荐(0) 编辑
摘要:无向图的最小环:从某个点出发走回自己的最短路径,路径上至少有三个点搜索做法:View Code 1 //PKU 1734 无向图的最小环,搜索做法 2 #include 3 #include 4 #include 5 using namespace std; 6 const int N = 110... 阅读全文
posted @ 2011-11-10 22:06 Because Of You 阅读(1623) 评论(1) 推荐(1) 编辑
摘要:很明显的二分匹配,只是直接把可以组成的两个正方形的地方连边的话会重复计算,结果是最大匹配数的两倍,但方案不好输出但由于每两个相邻的正方形的(x+y)奇偶性(行和列相加)是不同的,所以,就可以把奇的放左边偶的放右边(或倒过来,都可以)匈牙利之后直接输出匹配数和方案就好了View Code 1 #include<stdio.h> 2 #include<string.h> 3 #include<vector> 4 using namespace std; 5 bool map[110*110]; 6 vector<int> g[10005]; 7 in 阅读全文
posted @ 2011-11-07 10:45 Because Of You 阅读(275) 评论(0) 推荐(0) 编辑
摘要:!A的感觉真是好,继续加油!View Code 1 #include<stdio.h> 2 #include<string.h> 3 #include<math.h> 4 #include<algorithm> 5 using namespace std; 6 #define M 16 7 const double eps=1e-8; 8 int map[M][M]; 9 const int inf = 1000000;10 bool flag[M];11 int D[M],nodes[M],w[M];12 int n,m,rest[M];13 阅读全文
posted @ 2011-11-05 22:10 Because Of You 阅读(372) 评论(0) 推荐(0) 编辑
摘要:转载。。题目链接:http://poj.org/problem?id=2349这个问题是最小生成树的问题假设d已知,把所有铺设线路的村庄连接起来,构成一个图。需要卫星设备的台数就是图的连通支的个数。d越小,连通支就可能越多。那么,只需找到一个最小的d,使得连通支的个数小于等于卫星设备的数目。把整个问题看做一个完全图,村庄就是点,图上两点之间的边的权值,就是两个村庄的直线距离。只需在该图上求最小生成树,d的最小值即为第K长边!因为:最小生成树中的最长k-1条长边都去掉后,正好将原树分成了k个连通分支,在每个连通分支上摆一个卫星设备即可那么剩下的各村庄之间的连线,最长不用超过第k长边的长度。Vie 阅读全文
posted @ 2011-11-05 18:05 Because Of You 阅读(303) 评论(0) 推荐(0) 编辑
摘要:题意:有一幅图,现在要加一条边,加边之后要你删除一条边,使图不连通,费用为边的费用,要你求的是删除的边的最小值的最大值(每次都可以删除一条边,选最小的删除,这些最小中的最大就为答案)首先要进行缩点,把图缩为一棵树,因此,加入一条边后图就会存在一个环,环中的任何一条边删除后都不会导致图不连通之后找一条最小的边,可以说这条边肯定是在加边之后的连通块里的,因为如果不在连通块里,那就直接可以把这条最小的边删掉,而达不到求出答案的目的找到边后,分别从边的两点开始遍历,要遍历出一条路径来,并且边上的权值要尽可能的小,因为这样才能让不在环中的边尽可能的大,然后,答案就是每个节点的次小儿子的最小值,如果没有次 阅读全文
posted @ 2011-11-04 09:39 Because Of You 阅读(1270) 评论(0) 推荐(1) 编辑
摘要:昨天一直WA,仔细看了下,是最小生成树的写法问题,路径记录的不正确,以后果断换种写法我的做法是先求最小生成树,再枚举树边去掉,再求最小生成树,看是否还是相同的结果,如果是,则证明不唯一View Code 1 #include<stdio.h> 2 #include<string.h> 3 #include<vector> 4 #define M 110 5 using namespace std; 6 vector<int> edge[110]; 7 int map[110][110]; 8 const int inf = 9999999; 9 阅读全文
posted @ 2011-11-03 08:06 Because Of You 阅读(1727) 评论(1) 推荐(0) 编辑
摘要:用一种颜色,两种颜色,三种颜色去对图染色,染色成功则输出颜色数,否则输出4View Code 1 #include<stdio.h> 2 #include<string.h> 3 bool g[26][26]; 4 int used[26]; 5 int n; 6 bool dfs(int id,int color) 7 { 8 int i,j; 9 bool flag;10 for(i=0;i<color;i++)11 {12 flag=true;13 used[id]=i;14 for(j=0;j<id;j+... 阅读全文
posted @ 2011-11-01 23:33 Because Of You 阅读(366) 评论(0) 推荐(0) 编辑