Graph Theory
文章平均质量分 74
Masamiiiii
这个作者很懒,什么都没留下…
展开
-
HDU 4888 Redraw Beautiful Drawings 最大流(唯一性)
题意:n*m矩阵 告诉每行的和,每列的和,问每个格子只能填0~k时 是否有解,若有唯一解 输出该解.n,m每行i每列j看作一个点,i->j的容量为k 流量就相当于a[i][j]源点连接每行,容量为行和.列连接汇点,容量为列和.若有解 则一定能跑出最大流,(行累加和等于列累加和,源点流出要等于汇点流入) 若残余网络中存在长度大于2的环,沿着环每条边流量++(反向边流量++时,撤销原创 2017-07-24 17:10:25 · 372 阅读 · 0 评论 -
Codeforces 776D The Door Problem 二分图判定
点击打开链接题意:n个开关,m扇门(n,m注意到一个门只被两个开关控制 若门初始为0 则控制它的两个开关状态相反,门初始为1则 要求控制的两个开关状态相同,才能可以把门置为1.以开关为顶点,(u,v)的边为被(u,v)控制的门的初始状态, dfs做二分图染色,判断每条边(每扇门)是否都能被满足即可#include using namespace std;typedef lo原创 2017-02-24 14:04:27 · 704 阅读 · 0 评论 -
Codeforces 427C Checkposts 强连通分量(tarjan)
点击打开链接题意:n个点,m条(n思路:设置点最少:对于同一个强连通分量只要设置一个点即可,钱最少选出每个强连通分量中最小的c[i],方法数为每个SCC中最小c[i]个数的乘积.资料Tarjan算法是基于对图深度优先搜索的算法,每个强连通分量为搜索树中的一颗子树。搜索时,把当前搜索树中未处理的节点加入一个堆栈,回溯时可以盘对栈顶到栈中的节点是否为一个强连通分量原创 2017-02-09 11:51:22 · 661 阅读 · 0 评论 -
ABC 051D Candidates of No Shortest Paths 最短路(Floyd)
点击打开链接题意:n个点m条边,求不在任意两点最短路径上的边个数 n边(i,j) 在(s->t)的最短路径上的充要条件为 dist[s][i]+w[i][j]+dist[j][t]=dist[s][t]; 等式1 暴力枚举:边和s,t复杂度为O(m*n*n)因为此时 边(i,j)在s->t上 所以顶点j为s->t的中间结点 dist[s][t]=dist[s][j]+dist[j]原创 2017-01-09 14:11:18 · 549 阅读 · 0 评论 -
Codeforces 711D Directed Roads dfs(找环)
点击打开链接题意:给定n个点n条边(n关键:因为每个点的出边只有一个,若有u->v路径无环,则u->v为简单的路径只有n-1条边,则该路径边可以随意反转 (v的出边可能和其他边形成环)在环上的边至少反转一条即可变为无环(环变为若干条链),但不能全部翻转.#include using namespace std;typedef long long ll;const ll原创 2017-01-09 11:38:51 · 363 阅读 · 0 评论 -
POJ 1789 Truck History MST(水)
点击打开链接//题意:要求 sigma(d(t0,tx))最小 &&任意两个点之间均有路径//则所有点处于同一个连通分量 ,边权和最小,即求出最小生成树即可 #include #include #include using namespace std;const int N=2e3+20;int n,g[N][N];char s[N][N];int cal(int原创 2017-01-07 19:48:09 · 304 阅读 · 0 评论 -
POJ 1523 SPF Tarjan求无向图割点
点击打开链接参考题意:求无向联通图的割点(关节点)关节点:在无向连通图中,删除一个顶点v及其相连的边后,原图从一个连通分量变成了两个或多个连通分量,则称顶点v为割点,同时也称关节点(Articulation Point)情况1:root子结点数如果>=2,则root为割点(去掉root后,root的子树不联通)情况2:v(u的儿子)到不了u以上的结点,则去掉原创 2017-01-07 00:40:39 · 387 阅读 · 0 评论 -
Codeforces 745C 并查集+贪心
点击打开链接//题意:n个定点 m条边(无重边),有k个顶点之间不能有路径存在,问最多能添加多少条边时,仍然满足情况 //因为k个顶点之间不能有路径存在 则最后图中剩下的联通分量个数为k//显然最后组成的最大的哪一个联通分量,点数要尽可能的多,其余有限制的联通分量里面的边数是size*(size-1)/2#include using namespace std;typede原创 2016-12-18 10:11:52 · 618 阅读 · 0 评论 -
hdu 2586 How far away LCA在线RMQ(模板题)
点击打开链接求dist(u,v) 用最短路flold显然超时 由于是树,则可以O(n)求出w=LCA(u,v)dist(u,v)=d(u)+d(v)-2*d(w); d(i)为根到结点i的距离 计算w=LCA(u,v) w为u->v路径中深度最小的点 则先用dfs记录u->v路径的遍历顺序,然后RMQ求出该路径中(pos[u]~pos[v])中dep最小的编号x 返回vs[x]即可原创 2016-11-26 21:49:43 · 371 阅读 · 0 评论 -
Codeforces 510C Fox And Names 拓扑序+判环
点击打开链接题意:给出n个string 每个长度为l,n,lsi和si+1第一个不相等的为u,v.若u!=v 则令边为u->v 表示字母v大于字母u 建好图之后,dfs判断图中是否有环 如果图中无环,最后按照拓扑序输出方案即可 #include using namespace std;typedef long long ll;const int N=2e3+20;v原创 2017-02-27 15:02:26 · 282 阅读 · 0 评论 -
Codeforces 501C Misha and Forest 拓扑序
点击打开链接题意:n个点组成的森林,n若v的degree为1,则有边v->s[v],按照拓扑序遍历树,依次更新出边即可 #include using namespace std;typedef pair ii;const int N=2e5+20;int n,d[N],s[N],vis[N];queue q;vector ans;void Topo(){ m原创 2017-04-18 20:13:07 · 316 阅读 · 0 评论 -
Codeforces 789D Weird Journey 欧拉图(计数)
题意:n点m条边的无向图,无重边,可能有自环,n,m把无向边变为有向,则相等于问2*m条,去掉两条边的后,存在欧拉路径时的去边方案?无向边变为有向边后,每个顶点入度等于出度.对两条去掉的边 分类讨论Case1:去掉两条不相邻的regular边(不带环) 显然产生4个奇点 欧拉路不存在Case2:去掉两条相邻的regular边,xyz 正好产生(x,z)两个奇点 成立原创 2017-06-23 19:54:24 · 465 阅读 · 0 评论 -
ARC 074F Lotus Leaves 最大流最小割
点击打开链接题意:n*m地图 n,m先把图变为二分图,每行每列加上源点和汇点,两边点分别为1~n,1~m对叶子'o'(x,y):x-y连接一条边 表示第x行的叶子可以跳到第y列 流量为1:表示删除(x,y)这一个点 加上边 S->SX S-SY TX->T,TY->T 容量为inf 不能删除答案显然为最大流 否则s->t存在增广路径 现在只要求出从S->T的最大流即原创 2017-05-22 16:15:04 · 518 阅读 · 0 评论 -
POJ 1273 Drainage Dithches 最大流(EK,模板题)
点击打开链接题意:n点m条边,每条边有容量ci 问从s->t的最大流?f(u,v)f(u,v)=-f(v,u)=val 从u流val到v 等价于于 从v流-val到u (两者都使得v增加val,u减小val) ,或者说u->v流量的减小等价于v->u流量的增加关于f的残余网络Gf: 其容量c'(u,v)=c(u,v)-f(u,v) 表示该弧还可以增加的流量原创 2017-05-22 11:44:17 · 298 阅读 · 0 评论 -
POJ 2186 Popular Cows 强连通分量(Kosaraju)
点击打开链接题意:n个点m条边的有向图,n,m直接暴力 从每个点出发 更新每个点的到达次数 最坏为O(NM) TLE如果A为合法 B也为合法 则A,B显然能互相到达 即A,B在同一个强联通分量中如果某个强连通分量中存在点A合法 则显然该强连通分量内所有的点也都合法.则分解出强联通分量 缩点后 变为DAG 显然只要判断所有点是否能到达,拓扑序中最后一个强联通分量上即可原创 2017-05-19 12:12:31 · 344 阅读 · 0 评论 -
POJ 2112 Optimal Milking 二分+最大流
点击打开链接题意:c头牛 k台机器 每台机器可以装m只牛,知道任意的牛-机器,机器-机器,牛-牛的距离c建图:源点到牛:容量为1,费用为0.牛到机器容量为1,费用为最短距离.机器到汇点容量为m,费用为0.则把c头牛装到k台机器的最小花费为:流量为c的最小费用流 现在要求的是:最长路径最短,二分答案x,建图时忽略花费>x的路径,判断最大流是否能到达n即可. #includ原创 2017-05-28 00:29:37 · 368 阅读 · 0 评论 -
SPOJ HighWays 生成树计数 模板题(Matrix-Treed定理)
点击打开链接参考链接参考链接题意:给出n个点,m条边的无向图 n对于一个无向图G 它的生成树个数等于其Kirchhoff矩阵任何一个n-1阶主子式的行列式的绝对值Kirchhoff矩阵=度数矩阵-邻接矩阵 #include using namespace std;typedef long long ll;const int N=2e3+20;ll deg原创 2017-05-08 15:25:18 · 369 阅读 · 0 评论 -
POJ 2135 Farm Tour 最小费用流
点击打开链接题意:n个点,m条边,n贪心:从1到n找最短路在把路径反向 在从n到1找最短路,非常容易举出反例(样例即可)该贪心是错误的.因为边为无向边 所以可以转换成求出两条1~n的路径 并且这两条路径无公共边 路径之和最短建图:每条边流量为1,费用为长度.上面问题就等价于,求从1~n流量为2的最小费用流 #include #include #include #i原创 2017-05-26 17:06:12 · 355 阅读 · 0 评论 -
POJ 2195 Going Home 最小费用最大流(模板题)
以下来自点击打开链接最小费用最大流 通过EK,Dinic,ISAP算法可以得到网络流图中的最大流,一个网络流图中最大流的流量max_flow是唯一的,但是达到最大流量max_flow时每条边上的流量分配f是不唯一的。 如果给网络流图中的每条边都设置一个费用cost,表示单位流量流经该边时会导致花费cost。那么在这些流量均为max_flow的流量分配f中,原创 2017-05-23 12:17:54 · 720 阅读 · 0 评论 -
Codeforces 742C Arpa's loud Owf 思维
点击打开链接题意要求:x->y y->x要t次 即x->y->x要2*t次 //i总有一次为winner,所以总要有个人的c[k]为i,即每个c[i]都不同,否则无解 现在按照i->c[i]建立有向图,则能互传的两个人一定在同一个环内 如果环上定点数为偶数cnt,则t尽量小取cnt/2即 lcm(k,x),(2k,x)求lcm时k显然会更小 奇数的话,t只能取k*cn原创 2016-12-08 11:25:59 · 420 阅读 · 0 评论 -
poj 2570 Fiber Network Floyd思想+二进制处理
点击打开链接题意:某条道路由一些公司修建,修建道路的公司可以提供这条路上的连通,询问哪些公司可以提供从A到B的路径.每个公司由一个小写字母表示。Floyd的递推式可以有若干种变形:加法,min,max,与和或运算等等//d(k)[i][j]:提供i->j连接&&中间点序号不大于k时 = 提供i-j连接&&中间节点序号j连接&&中间节点序号为k(即提供i->k&&提供k->j连接的公原创 2016-12-06 19:46:30 · 278 阅读 · 0 评论 -
poj 1125 Stockbroker Grapevine Floyd(基础题)
点击打开链接d(k)[i][j]:i->j中间点序号不大于k时 =min(i-j中间节点序号小于k,i->j中间节点序号为k) d(k)[i][j]=min(d(k-1)[i][j],d(k-1)[i][k]+d(k-1)[k][j]))#include #include #include #include #include #include using names原创 2016-12-06 19:35:03 · 269 阅读 · 0 评论 -
poj 3250 Floyd求负圈
点击打开链接#include #include #include #include using namespace std;const int M =510;int d[M][M];// d[i][j] i~j最短距离int n,m,w;int main(){ int t; scanf("%d",&t); while(t--) { scanf("%d%d%d",原创 2016-07-14 20:49:34 · 369 阅读 · 0 评论 -
poj 2139 Floyd入门
点击打开链接#include #include #include using namespace std;const int M =310;int d[M][M];// d[i][j] i~j最短距离int n,m,a[110000];int main(){ cin>>n>>m; memset(d,0x3f,sizeof(d)); for(int i=1;i原创 2016-07-13 21:12:48 · 303 阅读 · 0 评论 -
poj 2395 MST的最大边(水)
点击打开链接题意:从源点能到任意一点且 每走1单位长度就要消耗一单位水,每到一个农场可以把自己的水充满,求至少要带的水。 思路:图要是连通的&&每条边尽量小 (若已经连通 在加边的只可能增大ans) -》 求MST的最大边即可#include #include #include using namespace std;const int M = 51010;struct ed原创 2016-07-13 10:56:13 · 266 阅读 · 0 评论 -
poj 3723 MST
点击打开链接#include #include #include using namespace std;const int M = 51010;struct edge{ long u; long v; long long cost; bool operator <(const edge &t)const { return cost>t.cost; }}e[M];原创 2016-07-13 10:20:19 · 268 阅读 · 0 评论 -
poj 2377最大生成树 Kruskal
点击打开链接#include #include using namespace std;const int M = 21010;struct edge{ int u; int v; long long cost; bool operator <(const edge &t)const { return cost>t.cost; }}e[M];int n,m,fa[原创 2016-07-12 21:34:00 · 328 阅读 · 0 评论 -
poj 1258 最小生成树Prim
点击打开链接#include #include using namespace std;const int M =110;long g[M][M]; // g[i][j] i->j 花费 long long d[M];// d[i] 点i到生成树距离 int main(){ int n; while(cin>>n) { for(int i=0;i<n;i++)原创 2016-07-12 20:43:57 · 362 阅读 · 0 评论 -
nyoj 38 Prim裸题
http://acm.nyist.net/JudgeOnline/problem.php?pid=38#include #include #define M 610int g[M][M],dist[M];int main(){ int t,i,j,k,v,e,a,b,c,min,ans; scanf("%d",&t); while(t--) { memset(g,原创 2016-05-07 15:41:50 · 568 阅读 · 0 评论 -
poj 3255次短路(暴力法)
点击打开链接http://poj.org/problem?id=3255#include #include #include #include #include #include #define M 5010#define Me 200005const int Inf=1000001000;using namespace std;struct edge{原创 2016-05-26 20:40:07 · 376 阅读 · 0 评论 -
poj 3268 Dijkstra运用
点击打开链接#include #include #include #include #include #include using namespace std;const int M = 10240;int n,m,x; struct edge{ int to,cost; edge() { } edge(int to, int cost) : to(原创 2016-07-15 21:44:30 · 300 阅读 · 0 评论 -
poj 3169 BellmanFord—差分约束
点击打开链接#include #include #include #include using namespace std;const int M = 1100;const int inf=1000000000; int n,ml,md; int d[M];struct edge{ int to,cost; edge(int a,int b):to(a),cost(b)原创 2016-07-16 21:50:45 · 358 阅读 · 0 评论 -
poj 2387 bellman-ford裸题
点击打开链接d(k)[i]:源点到i最多经过k条边时的最小值 d(k)[i]=min(d(k-1)[i],d(k-1)[j]+w(j,i))无负圈,则最短路最多经过n-1条边 #include #include #include #include using namespace std;typedef long long ll;const int N=1e3+20;原创 2016-12-04 19:55:40 · 503 阅读 · 0 评论 -
ZOJ 2750 Idiomatic Phrases Game 最短路(dijkstra)
点击打开链接按照题意建图,跑个最短路即可#include #include #include #include #include #include using namespace std;typedef pair ii;typedef long long ll;const ll inf=1e8;const int N=1e3+20;int n;struct node原创 2016-12-06 15:35:47 · 334 阅读 · 0 评论 -
poj 1511 Invitation Cards 最短路SPFA(模板题)
点击打开链接SPFA:动态逼近法定理:只要最短路径存在,上述SPFA算法必定能求出最小值。证明:每次将点放入队尾,都是经过松弛操作达到的。换言之,每次的优化将会有某个点v的最短路径估计值d[v]变小。所以算法的执行会使d越来越小。由于我们假定图中不存在负权回路,所以每个结点都有最短路径值。因此,算法不会无限执行下去,随着d值的逐渐变小,直到到达最短路径值时,算法结束,这时的最短路径估计原创 2016-12-06 17:07:58 · 400 阅读 · 0 评论 -
hdu 5883 欧拉路
点击打开链接#include #include #include #include using namespace std;const int N=1e5+7;int n,m;int val[N];int deg[N]; int main(){ int t; cin>>t; while(t--) { cin>>n>>m; memset(deg,0,sizeo原创 2016-09-30 14:45:38 · 412 阅读 · 0 评论 -
CF 372D Dijkstra+模拟
点击打开链接先判断无解情况: 情况1:不加'0'边时 最短路d[t]情况2:加入'0'边时,使'0'边的权为最小的1 此时最小d[t]>L 无解剩下的情况都为有解 因为(s,t)的路径路径只剩下 d[t]不断对最短路径中的'0'边进行松弛使之达到L 此时判断最短路是等于L(松弛后的次短路变为最短路可能小于L)#include #include #include usi原创 2016-09-29 16:51:16 · 557 阅读 · 0 评论 -
codeforces 624C 二分图染色
点击打开链接//b和a,c都相连 不相连的只有a-c 所以原图中的两点无边只能为a-c //在补图中确定颜色法案后,还要在原图中check一遍#include #include #include #include #include #include #include #include #include #include #include using names原创 2016-10-21 23:19:24 · 526 阅读 · 0 评论 -
hdu 5876 求补图上的最短路
点击打开链接//利用map求出补图的边 然后就可以bfs算了..#include #include #include #include #include #include #include using namespace std;const int inf=1<<20;const int M = 2e5+5;int n,m;map e[M];int dis[M];原创 2016-09-13 20:11:08 · 290 阅读 · 0 评论 -
poj 1386 单词连接 欧拉图+并查集判连通
点击打开链接#include #include #include #include using namespace std;const int M =30;int in[M],out[M],vis[M],fa[M];void Init(){ for(int i=0;i<26;i++) { fa[i]=i; }}int find(int x){ if(x原创 2016-07-31 22:03:28 · 441 阅读 · 0 评论