
图论
文章平均质量分 72
ehi11
这个作者很懒,什么都没留下…
展开
-
uva 1423 Guess
/* 利用前缀和的思想进行转化,每个符号可以得出一个不等关系,利用前缀和将其转化为二元关系,然后一个二元组为一条有向边,进行拓扑排序,按拓扑的顺序进行赋值。*/#include #include #include #include #include using namespace std;bool map[11][11];int in[11],ans[11];bool vi原创 2013-05-18 22:45:36 · 1403 阅读 · 1 评论 -
Legal or Not 拓扑加邻接表 hdu
#include #include #include #include using namespace std;const int maxn=101;struct edge{ int from,to,next;} e[maxn<<1];int head[maxn];int in[maxn];int n,t,m;bool topsort(){ queue原创 2012-08-28 14:40:37 · 651 阅读 · 0 评论 -
Minimum Transport Cost hdu 点权和边权的最短路+输出字典序最小的路径
/*可以用path来记录前驱结点或者是后继结点。而对于输出最小的字典序必须要记录后继结点。主要是path记录路径方法的应用。而对于点权,可以直接进行加处理。然后一遍floyd即可。*/#include #include const int maxn=101;int map[maxn][maxn];int cost[maxn];int path[maxn][maxn];int ma原创 2012-08-28 22:29:42 · 1616 阅读 · 0 评论 -
确定比赛名次 hdu 拓扑输出字典序最小解
#include #include const int maxn=501;int map[maxn][maxn];int in[maxn];int ans[maxn];int main(){ int n,m,u,v; while(scanf("%d%d",&n,&m)==2) { memset(in,0,sizeof(in));原创 2012-08-28 16:00:56 · 1015 阅读 · 0 评论 -
Frogger 最短路变种
/*注意细节。memset里面的0x7f和常数赋值的0x7f差别很大。常数赋值的数值很小。而memset内部是按照字节进行赋值。是一个很大的值。这一道题是一道最短路的变种。实际上是求所有路径中最大边的最小值。起点是1,终点为2.*/#include #include #include #include using namespace std;double dist[201];do原创 2012-08-27 09:11:07 · 771 阅读 · 0 评论 -
图论小结(一)包括一些最短路,最小生成树,差分约束,欧拉回路,的经典题和变种题。强连通,双连通,割点割桥的应用。二分匹配,KM,支配集,独立集,还有2-SAT。
图论小结(一)下面是对暑假集训的图论部分的一些总结和体会。包括一些最短路,最小生成树,差分约束,欧拉回路,的经典题和变种题。强连通,双连通,割点割桥的应用。二分匹配,KM,支配集,独立集,还有2-SAT。下面就暑假写过的一些题做一个小结。(1)最短路的话一个主要掌握三个算法和两个优化。Dijsktra单源最短路,可以变形他的松弛条件,而产生很多的最短路变种,题型非常灵活。Floyed可求全原创 2012-08-27 09:57:23 · 6969 阅读 · 0 评论 -
Network of Schools hoj&poj 强连通分量的应用 经典题!
/*该题第一问是最少在几台电脑上放文件,可以在一瞬间使所有的电脑都接收到文件。考虑在同一个强连通分量重的电脑,如果其中一台接受到文件,那么可以瞬间使这个分量里的所有电脑都接受到文件。所以第一问的答案只需要求缩点以后的入度为0的分量的个数即可。而对于第二问,同样也是对缩点后的新图进行处理。取入度为0的分量数和出度为0的分量数的最大值。即相当于一棵树的叶子和树根。还有一个,当整个图是一个强连原创 2012-09-03 19:45:40 · 1741 阅读 · 0 评论 -
poj 2449 k短路模板
#include #include #include #include #include using namespace std;const int maxn=1001;const int maxm=100001;const int inf=1<<30;struct edge{ int from,to,next,w;};edge e1[maxm];edge e2[原创 2012-09-03 11:06:45 · 1641 阅读 · 0 评论 -
Help the Hurricane Victims 删边法的次短路
/*之前用两种方法写过次短。分别是两次的spfa和二维的dij。其中应该是以两次的spfa的效率最高。二维dij可以很方便的统计次短路的数量。而这二者对于次短路不存在的请在好像都难以判断,反正我试过都没有写出来。为了解决次短路不存在的状况,使用删边法。具体的操作就是先保存最短过程中的路径,然后沿着路径枚举边进行删除,就是讲边的权值置为inf。然后取最小即可。*/#include con原创 2012-09-01 16:00:02 · 1322 阅读 · 0 评论 -
poj Roadblocks 次短路(数据较大)
/*这种思路是在网上借鉴的。很好。速度也非常快。自己实现了一遍。在poj上181MS。主要是分别一起点和终点为源点作两次spfa。然后次短路必定是dist[u]+w+rdist[v]。枚举边。u,v,为边的两个端点,w为边的权值。这个值需要满足的条件是 >dist[n],然后再最小值。*/#include #include #include #include using nam原创 2012-09-01 15:05:27 · 1058 阅读 · 0 评论 -
Guardian of Decency hoj poj 二分图匹配 不错的题
/*这个题的原意是求不能成为夫妇的人的最大数量。但是这个只需要满足四个条件中的一个就可以连一条边,这样匹配后产生的课匹配的边数量过多,就超时了。可以反过来想,求不满足题意,即能成为夫妇的点数,再用总数n-此时的最大匹配数m。因为是拆点建图,所以m/=2.最大二分匹配就转化成了最小覆盖。另外,对500上限的点数,用邻接矩阵是0.59s。而用vector的临接表是0.21.时间效率很客观,原创 2012-09-29 23:22:58 · 878 阅读 · 0 评论 -
Alien Security hoj poj 最短路应用好题
/*题意是求一个离终点最近的点使得去掉该点之后起点到终点不连通。*//*对于距离最近,可以终点为源点作spfa,预处理出从终点到其余各点的最短路径,这里有些细节要注意,一个是松弛时应用map[i][x]的松弛的条件,而非map[x][i],因为题意是有向图且路径方向是从起点到终点,然后直接相邻的两个点边权处理为1.最后是用深搜判断两点是否连通。*/#include #include原创 2012-10-04 08:32:56 · 809 阅读 · 0 评论 -
Numbering Paths 统计任意两点间路的数量 小范围数据floyd变体
/*floyd的妙用啊。和倍增的思想有点类似。对哈希后的图矩阵作N次floyd后,图中任意两点的值表示两点之间路的条数。如果c[k][k]!=0,则说明k是环上一点。*/#include #include #include using namespace std;int map[31][31];int main(){ int n,a,b,t; int ca=0;原创 2012-09-16 09:47:52 · 2243 阅读 · 0 评论 -
Going in Cycle!! uva
/* 求平均权值最小的回路。这里有有个转化。W1+W2+...+Wk二分回路的平均权值mid,将上式转化为(W1-mid)+(W2-mid)+.......+(Wk-mid)即用spfa来判断是否存在负权回路,注意是负权的回路。不存在的情况为当mid=max(Wi)+1时依然不存在负权回路,则无解。因为此时mid为可能取到的最大值,此时都不能有负权回路的话,当mid取更小的值时原创 2013-05-18 10:50:09 · 867 阅读 · 0 评论 -
LRJ白书图论 11324 - The Largest Clique uva
/* 题意:给一张有向图,求这样的一个点集,使得集合中的点u,v,u->v,or v->u,or,uv。 对图缩点,构造一张DAG。在DAG上作dp最长路。 点权为每个强连通分量重节点的个数。*/#include #include #include #include using namespace std;const int maxn=1010;const int原创 2013-05-04 08:37:43 · 1332 阅读 · 0 评论 -
2-sat hoj 和平委员会 Peaceful Commission
/*2-sat第一题。好题啊!首先2-sat是一个2限定性问题。一组有2个元素。若a和b矛盾,则a和b同组的另一个元素连一条边。此为建图。然后注意要反向存图,建立以缩点为节点的新图。然后对新图进行自底向上的拓扑排序。然后按顺序输出一组解。*/#include #include #include #include using namespace std;const int原创 2012-09-20 09:14:09 · 2184 阅读 · 0 评论 -
Catenyms poj hoj 欧拉回路输出路径
#include #include #include #include using namespace std;const int maxn=1001;struct edge{ int to,next;} e[10005];struct word{ char s[25];} word[maxn];bool vis[maxn],used[27];int he原创 2012-10-10 22:39:00 · 1753 阅读 · 0 评论 -
Frame Stacking 很好的拓扑排序题 hoj&poj
/*题意自己看。思路是先找出每个字符对应矩形框的的边界,即四个角的值。然后排个序。对每个字符对应的矩型框,扫描在矩形框上和该字符不相同的字符,然后在这两个字符之间连一条边,更新后一个字符的入度,有个需要注意的地方就是对每一个字符的矩形框上的不同字符,若出现好几次,则只更新一次入度,这个可以用一个bool数组来判重。然后图统计好之后就开始拓扑排序。因为要按字典序输出多组解。所有采用D原创 2012-09-17 17:14:07 · 671 阅读 · 0 评论 -
John's trip 欧拉回路输出路径
/*欧拉回路和欧拉路径的判断欧拉回路:无向图:每个顶点的度数都是偶数,则存在欧拉回路。有向图:每个顶点的入度都等于出度,则存在欧拉回路。欧拉路径:无向图:当且仅当该图所有顶点的度数为偶数 或者 除了两个度数为奇数外其余的全是偶数。有向图:当且仅当该图所有顶点 出度=入度 或者 一个顶点 出度=入度+1,另一个顶点 入度=出度+1,其 他顶点 出度=入度。*//*用 g[u][e]原创 2012-08-15 23:08:04 · 4466 阅读 · 0 评论 -
Redundant Paths poj&hoj 割边 tarjan
/*题意就是至少加多少条边,使得任意两点间至少有两条不同的路。求双连通分量。然后统计叶子个数,即入度为1的点的个数,然后ans=(num+1)/2.在求双连通分量的过程中low值相等的是在同一个分量里。不需要用stack来进行保存。*/#include #include #include using namespace std;const int maxm=10001;cons原创 2012-09-16 09:51:18 · 644 阅读 · 0 评论 -
tarjan hdu How far away ? 2586
#include #include struct edge{ int to,next,w;};int n,m,t,h;edge q[40001<<1],rq[401];//q存的是原数组,rq存的是询问数组。int head[40001],head1[40001],dis[40001],f[40001];//dis表示当前节点到跟节点的距离。bool vis[40001];原创 2012-09-14 22:06:47 · 571 阅读 · 0 评论 -
Following Orders hoj poj 拓扑序+字典序
/*一直对深搜中的回溯不是很理解。用这个题来加深一下吧。先用下hash,在排序。对于不在拓扑排序中出现的点,在统计中的入度也为0,如案例1中的g,这样在深搜的过程中按照字典序进行排列即可。*/#include #include #include #include #include using namespace std;char a[21];int b[21],in[21原创 2012-09-16 09:44:47 · 835 阅读 · 0 评论 -
A Plug for UNIX 最大流
/*题意就是给了你m个电器,n个插头,tt个转换器,以及自己增加一个虚拟的源点和汇点。将转换器和插头相连的边置为无穷大。其余的边长度都置为1.该模板中n表示图中节点的总数。最后要记得修改。还有一点需要注意的就是转换不是只有样例中给出的'X,可能有无数个,无数种类型。在这里借鉴了一种网上map的写法。很简介。下面这个网址给了一张图很详细。一看便知http://www.cnblogs.com/lo原创 2012-08-20 08:24:04 · 816 阅读 · 0 评论 -
T-Shirt Gumbo 二分最大匹配 hoj
/*将所有的点离散开来。避免多重匹配。*/#include #include #include #include #include #include using namespace std;bool vis[200];int s[200];int cnt[200];int match[200];int n;vector mat[200];int find(int x)原创 2012-08-16 19:05:27 · 649 阅读 · 0 评论 -
poj 2446 Chessboard 二分图最大匹配经典题
/*题意是在一些有洞的棋盘上用一个1x2的方形条将棋盘完全填满。可以对不是洞的每一个点找和他相邻的点,如果他相邻的点也不是洞的话,就画一条边。然后获取标号。实际上就是一个将一个点拆分成两个点的想法。将||可能||,可能匹配的点都连一条!!*/#include #include #include #include using namespace std;int map[40][40];原创 2012-08-16 22:08:40 · 884 阅读 · 0 评论 -
hdu 迷宫城堡 极大强连通分量的tarjan算法模板题
/*极大强连通分量的tarjan算法模板题。*/#include#include #include using namespace std;struct EDGE{ int to,next;} e[100005]; //边结点数组int head[10010],stack[10010],DFN[10010],Low[10010],Belong[100010];/原创 2012-08-15 23:10:52 · 1806 阅读 · 0 评论 -
The Bug Sensor Problem 最小生成树求第k大边
/*t题意有点不好读。就是求第k大边,注意精度的控制。该题卡精度。用ceil函数向上取整!*/#include #include #include #include #include #define maxn 100000#define inf 999999999999.0using namespace std;struct point{ double x,y;}原创 2012-08-15 23:01:13 · 1705 阅读 · 0 评论 -
hdu 过山车 二分匹配模板
#include #include bool map[501][501];bool vis[501];int match[501];int n,m;//注意,定义在主函数里的变量在main函数里面不能再定义。否则就失效,按0来计算!bool find(int x)//寻找A可能匹配的点集合{ for(int i=1; i<=m; i++)//m为待匹配集的个数 {原创 2012-08-16 10:33:33 · 573 阅读 · 0 评论 -
Heavy Cargo 最短路变种
/*就是求所有边中最小边的最大值。相对应的就是求所有边中最大边的最小值,就是frogger。该题的转移方程就是:dist[j]=max(dist[j],min(dist[k],map[k][j]));*/#include #include #include #include #include #define inf 99999999using namespace std;int原创 2012-08-15 23:06:09 · 644 阅读 · 0 评论 -
King 差分约束系统
/*注意将所有的不等式全都转化成<=的形式,如<1变为<=0.注意建模。即构造不等关系。然后将两端点反向存图。接着就上bellman,果断1A。*/#include #include #define maxn 101struct edge{ int u,v,val;} e[maxn];int dis[maxn];int n,m;bool bellman(int s){原创 2012-08-14 21:48:33 · 569 阅读 · 0 评论 -
Play on Words 并查集加欧拉回路
//用并查集的时候先将当做无向图来处理判断图的连通性。//然后用欧拉路的定义来求解。存在欧拉回路的条件是:所有点出度==入度。//存在欧拉道路的条件是:有且仅有两个点出度!=入度,且出度和入度之差为1.其余点出度==入度#include #include int f[27];int in[27];int out[27];bool vis[27];int find(int x){原创 2012-08-14 21:51:32 · 4107 阅读 · 0 评论 -
Communication Planning for Phobos 最小生成树加计算几何
#include #include #include #define maxn 101#define r 16.7/2.0#define pie acos(-1.0)struct point{ double x,y;}p[maxn];double dis(double x1,double y1,double x2,double y2,double R){ //参数原创 2012-08-14 21:50:14 · 584 阅读 · 0 评论 -
池子法 邻接表建图
#include #include #define maxn 1000struct edge{ int from,to,next,val;} e[maxn];int first[maxn];int main(){ int n; while(scanf("%d",&n)==1) { memset(first,-1,sizeof(firs原创 2012-08-14 13:35:34 · 2326 阅读 · 0 评论 -
Gopher II 二分最大匹配基础题
/*算鼠到洞的距离。在可能跑到的情况下连一条。在二分匹配。*/#include #include #include bool map[501][501];bool vis[501];int match[501];struct point{ double x,y;};double dis(point a,point b){ return (a.x-b.x)*(原创 2012-08-16 22:11:43 · 436 阅读 · 0 评论 -
Don't Get Rooked 二分最大匹配经典题
/*可以把一个图拆分成两个图。一个统计行,另一个统计列。如果一行连续,则将该连续块打上一个相同的标号,否则,标号加1,该部分的处理有点麻烦。这两个图的坐标如果有相等的部分,就在此连一条边.也是点拆分的建图方法,自身条件匹配,很经典的题。*/#include #include int r[5][5];int c[5][5];char map[5][5];char op[5];int g原创 2012-08-16 22:13:40 · 693 阅读 · 0 评论 -
Machine Schedule 二分图最大匹配基础题
#include #include bool map[101][101];bool vis[101];int match[101];int n,m,k;bool find(int x){ for(int i=1;i<=m;i++) { if(!vis[i]&&map[x][i]) { vis[i]=true;原创 2012-08-16 22:16:12 · 691 阅读 · 0 评论 -
Sightseeing trip floyd求最小环
/*无向图的最小环问题: 无向图的最小环的求法不可能和有向图的求法一样, 因为在有向图中i 到j 和 j 到i 算是一个环,但在无向图中不是一个环,如果直接用flody算法将会出错, 有向图的环可以为2个顶点,而无向图的环至少要三个顶点; 所以为了求无向图的最小环, 我们采用的原理是: 枚举最大环中的连接点,更新环的权重;比普通Floyd多出来的部分,主要利用到的原理是当处理到k时,所有以原创 2012-08-30 22:30:44 · 1313 阅读 · 0 评论 -
spfa 模板
#include #include #include #include #include using namespace std;const int maxn=300001;const int inf =0x7ffffff;struct edge{ int from,to,w,next;}e[1000001];int head[maxn];int vis[maxn]原创 2012-08-30 22:18:13 · 3729 阅读 · 0 评论 -
Jungle Roads Kruskal模板
#include #include #include #include using namespace std;const int maxn=101;struct edge{ int from,to,w,next;} e[maxn<<1];int f[maxn];int t;void add(int i,int j,int w){ e[t].from=i;原创 2012-08-30 22:27:24 · 640 阅读 · 0 评论 -
Power Network 最大流基础 hoj
/*题意中给出多个节点和多个发电站与消费站。可以建一个虚拟的源点和虚拟的汇点,将所有的发电站和源点连一条边,将所有的消费占和汇点连一条边。然后利用网络流建图即可。下面是SAP算法。*/#include #include #include #define SETZR(a) memset(a,0,sizeof(a))using namespace std;const int MAXM =原创 2012-08-20 08:18:29 · 695 阅读 · 0 评论