It计算机课件 山东大学ACM模板-图论_第1页
It计算机课件 山东大学ACM模板-图论_第2页
It计算机课件 山东大学ACM模板-图论_第3页
It计算机课件 山东大学ACM模板-图论_第4页
It计算机课件 山东大学ACM模板-图论_第5页
已阅读5页,还剩163页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

图论

1

1.最短路径..............................................................................4

1)Dijkstra之优雅stl...............................................................4

2)Dijkstra_模拟数组..............................................................4

3)Dijkstra阵......................................................................5

4)SPFA优化........................................................................6

5)差分约束系统.....................................................................7

2.K短路................................................................................7

1)Readme............................................................................7

2)K短路一无环一Astar.................................................................7

3)K短路三环一Yen..................................................................10

4)K短路一无环一Yen_字典序..........................................................12

5)K短路一有环_Astar................................................................15

6)K短路一有环.Yen..................................................................17

7)次短路经&&曲径数................................................................20

3.连通分支.............................................................................21

1)图论一SCC........................................................................21

2)2-sat............................................................................23

3)BCC..............................................................................25

4.生成树...............................................................................27

1)Kruskal..........................................................................27

2)Prim_MST是否唯一...............................................................28

3)Prim阵..........................................................................29

4)度限制MST.......................................................................30

5)次小生成树......................................................................34

6)次小生成树_阵..................................................................36

7)严格次小生成树..................................................................37

8)K小生成树伪代码................................................................41

9)MST计数一连通性状压一N0I07.......................................................41

10)曼哈顿MST.......................................................................43

11)曼哈顿MST一基数排序............................................................46

12)生成树变MST_sgu206.............................................................49

13)生成树计数.....................................................................52

14)最小生成树计数.................................................................53

15)最小树形图.....................................................................56

16)图论—最小树形图_double_poj3壹64...............................................58

5.最大流...............................................................................60

1)EdmondsKarp算法...............................................................60

2)SAP邻接矩阵....................................................................61

3)SAP模拟数组....................................................................62

4)SAP_BFS..........................................................................63

5)sgu壹85_AC(两条最短路径)......................................................64

6)有上下界的最大流一数组模拟.....................................................67

6.费用流...............................................................................69

1)费用流_SPFA_i^^................................................................69

2)费用流_SPFA」肖圈................................................................70

3)ZKW数由模拟....................................................................72

7.割.................................................................................73

1)最大权闭合图...................................................................73

2)最大密度子图....................................................................73

3)二分图的最小点权覆盖...........................................................74

4)二分图的最大点权独立集.........................................................75

5)无向图最小割_Stoer-Wagner算法.................................................75

6)无向图最大割....................................................................76

7)无向图最大割(壹6ms)............................................................76

8.二分图...............................................................................78

1)二分图最大匹配Edmonds..........................................................78

2)必须边..........................................................................79

3)最小路径覆盖(路径不相交).....................................................79

2

4)二分图最大匹配HK..........................................................................................................................80

5)KM算法一朴素_0(n4)........................................................................................................................81

6)KM算法一slack_0(n3)......................................................................................................................82

7)点BCC_二分判出一(2942圆桌骑士).................................................84

8)二分图多重匹配..................................................................86

9)二分图判定......................................................................88

10)最小路径覆盖(带权)...........................................................89

9.一般图匹配..........................................................................90

1)带花树一表.......................................................................90

2)带花树一阵.......................................................................93

10.各种回路...........................................................................96

1)CPP_无向图.....................................................................96

2)TSP_双调欧几里得................................................................97

3)哈密顿回路_dirac............................................................................................................................98

4)哈密顿回路一竞赛图..............................................................100

5)哈密顿路径一竞赛图..............................................................102

6)哈密顿路径一最优&状压..........................................................102

11.分治树............................................................................104

1)分治树—路径不经过超过K个标记节点的最长路径..................................104

2)分治树_路径和不超过K的点对数.................................................107

3)分治树—树链剖分_Count_hnoi壹036.........................................................................................109

4)分治树_QTree壹一树链剖分.......................................................113

5)分治树_P0J3237(QTree壹升级)_树链剖分.........................................117

6)分治树_QTree2一树链剖分.........................................................122

7)Qtree3..............................................................................................................................................125

8)分治树_QTree3(2)一树链剖分.....................................................128

9)分治树_QTree4_他人的..........................................................130

10)分治树_QTree5_无代码..........................................................135

12.经典问题..........................................................................135

1)欧拉回路一递归.................................................................135

3)同构一树.........................................................................137

4)同构一无向图....................................................................140

5)同构一有向图....................................................................141

6)弦图一表.........................................................................143

7)弦图一阵........................................................................147

8)最大面一朴素....................................................................149

9)最大团_快速....................................................................149

10)极大团.........................................................................150

11)havel定理.....................................................................151

12)Topological...................................................................................................................................151

13)LCA...................................................................................................................................................152

14)LCA2RMQ...........................................................................................................................................154

15)树中两点路径上最大-最小边Jarjan扩展........................................157

16)树上的最长路径.................................................................160

17)floyd最小环...................................................................161

18)支配集—树......................................................................162

19)prufer编码—树的计数..........................................................164

20)独立集_支配集_匹配............................................................165

21)最小截断.......................................................................168

3

最短路径

Dijkstra之优雅stl

#include<queue>

usingnamespacestd;

#definemaxn壹000

structDijkstra{

typedefpair<int,int>T;//first:权值,second:索弓I

vector<T>E[maxn];//边

intd[maxn];//最短的路径

intp[maxn];//父节点

priority_queue<T,vector<T>,greater<T>>q;

voidclearEdge(){

for(inti=0;i<maxn;i++)

E[i].clear();

}

voidaddEdge(inti,intj,intval){

E[i].push_back(T(val,j));

)

voiddijkstra(ints){

memset(d,壹27,sizeof(d));

memset(p,255,sizeof(p));

while(!q.empty())q.pop();

intu,du,v,dv;

d[s]=0;

P[s]=s;

q.push(T(0,s));

while(!q.empty()){

u=q.top().second;

du=q.top().first;

q-pop0;

if(d[u]!=du)continue;

for(vector<T>::iteratorit=E[u].begin();it!=E[u].end();it++){

v=it->second;

dv=du+it->first;

if(d[v]>dv){

d[v]=dv;

p[v]=u;

q.push(T(dv,v));

}

)

)

}

};

Dijkstra—模拟数组

typedefpair<int,int>T;

structNod{

intb,val,next;

voidinit(intb,intval,intnext){

th(b);th(val);th(next);

}

);

structDijkstra{

Nodbuf[maxm];intlen;//资源

intE[maxn],n;//图

intd[maxn];//最短距离

voidinit(intn){

th(n);

memset(Er255,sizeof(E));

len=0;

}

voidaddEdge(inta,intb,intval){

buf[len].init(b,val,E[a]);

4

E[a]=len++;

)

voidsolve(ints){

staticpriority_queue<Tzvector<T>,greater<T>>q;

while(!q.empty())q.pop();

memset(d,63,sizeof(d));

d[s]=0;

q.push(T(0,s));

intu,du,v,dv;

while(!q.empty()){

u=q.top().second;

du=q.top().first;

q.pop();

if(du!=d[u])continue;

for(inti=E[u];i!=-壹;i=buf[i].next){

v=buf[i].b;

dv=du+buffi].val;

if(dv<d[v]){

d[v]=dv;

q.push(T(dv,v));

}

)

)

}

};

Dijkstra阵

〃Dijkstra邻接矩阵,不用heap!

#definemaxn壹壹0

constintinf=0x3f3f3f3f;

structDijkstra{

intE[maxn][maxn],n;//图,须手动传入!

intd[maxn],p[maxn];//最短路径,父亲

voidinit(intn){

this->n=n;

memset(Ez63,sizeof(E));

)

voidsolve(ints){

staticboolvis[maxn];

memset(vis,0,sizeof(vis));

memset(d,63,sizeof(d));

memset(pz255,sizeof(p));

d[s]=0;

while(壹){

intu=一壹;

for(inti=0;i<n;i++){

if(!vis[i]&&(u==-S||d[i]<d[u])){

u=i;

)

)

if(u==-壹IId[u]==inf)break;

vis[u]=true;

for(intv=0;v<n;v++){

if(d[u]+E[u][v]<d[v]){

d[v]=d[u]+E[u][v];

p[v]=u;

)

)

)

}

}dij;

5

SPFA优化

'**

*以F程序加上了vis优化,但没有加slf和111优化(似乎效果不是很明显)

*下面是这两个优化的教程,不难实现

SPFA的两个优化

该日志由zkw发表于2009-02-壹309:03:06

SPFA与堆优化的Dijkstra的速度之争不是一天两天了,不过从这次USAC0月赛题来看,SPFA用在

分层图上会比较慢。标程是堆优化的Dijkstra,我写了一个非常朴素的SPFA,只能过6/壹壹个点。SPFA

是按照FIFO的原则更新距离的,没有考虑到距离标号的作用。实现中SPFA有两个非常著名的优化:SLF

和LLLo

SLF:SmallLabelFirst策略。

实现方法是,设队首元素为i,队列中要加入节点J,在dj<=di时加到队首而不是队尾,否则和普

通的SPFA一样加到队尾。

LLL:LargeLabelLast策略。

实现方法是,设队列Q中的队首元素为i,距离标号的平均值为avg(d),每次出队时,若di>avg(d),

把i移到队列末尾,如此反复,直到找到一个i使,di*avg(d)将其出队。

加上SLF优化后程序多了一行,过了9/壹壹个点。你问我怎么用SPFAAC这个题?利用分层图性

质,算完一层再算一层,对每一层计算用SPFA,加上上面的优化,程序飞快:最强的优化要利用题目的特

殊性质。

*/

#definemaxn壹0壹。

#definemaxm2壹00壹。

#defineth(x)this->x=x

structNod{

intb,val,next;

voidinit(intb,intval,intnext){

th(b);th(val);th(next);

}

);

structSPFA{

Nodbuf[maxm];intlen;

intE[maxn],n;

intd[maxn];

voidinit(intn){

th(n);

memset(E,255,sizeof(E));

len=0;

)

voidaddEdge(inta,intb,intval){

buf[len].init(bzval,E[a]);

E[a]=len++;

)

boolsolve(ints){

staticqueue<int>q;

staticintent[maxn];

staticboolvis[maxn];

while(!q.empty())q.pop();

memset(cntz0,sizeof(ent));

memset(dz63,sizeof(d));

memset(vis,0,sizeof(vis));

d[s]=0;

q.push(s);vis[s]=true;

intu,v;

while(!q.empty()){

u=q.front();q.pop();vis[u]=false;

for(inti=E[u];i!=-壹;i=buf[i].next){

v=buf[i].b;

if(d[u]+buf[i].val<d[v]){

6

d[v]=d[u]+buf[i].val;

if(!vis[v]){

q.push(v);vis[v]=true;

)

if(++ent[v]>n)returnfalse;

}

)

)

returntrue;

}

}spfa;

//poj-2983IstheInformationReliable?

//差分约束系统

intmain(){

intnzm;

charc;

inta,b,d;

while(scanf("%d%d"/&n,&m)!=EOF){

spfa.init(n+壹);

for(inti=壹;i<=n;i++){

spfa.addEdge(0,i,0);

)

for(inti=0;i<m;i++){

scanf(*'%c%d%d"z&c,&a,&b);

1

if(c=='V)spfa.addEdge(azb,一壹);

else{

scanf(n%d",&d);

spfa.addEdge(a,b,-d);

spfa.addEdge(b,a,d);

)

)

if(spfa.solve(0))printf(HReliable\nn);

elseprintf(,,Unreliable\n");

)

return0;

1差分约束系统

1.Xi-Xj<=C[i,j],则j向i连一条边,权值为c。

2.加入附加源S,S向每个点连一条边,权值为0。(只是为了保证图连通)。如果不加附加源也可以,在

SPFA的时候把所有的d初始化为0,并且所有的点都放入队列中。.

然而有的时候不能所有的d都初始化为0,也不能把所有的点都放入队列;这样的题往往是初始

化一部分d,并且放一部分d到队列中,一般用于求极值问题;如果是链式结构,从一头不行,就试

试另外一头。还是凭借感觉去做。具体的证明【【【待补完】】L

3.从S求解单源最短路径,到每个点的d值为它的一个x可行解。

4.如果{x0,x壹,x2…}是一组可行解,则{xO+d,x壹+d,x2+d…}也是。

5.注意序列益处的问题,可以适当的调整大小,对序列加减1操作。

6.如果是很多的离散的变量,可以用£xi来让他们加起来,并且2xi-£xi-壹进行差分约束

K短路

Readme

K短路小节:

壹.Yen适合做无环的,AStar适合做有环的

2.Yen不能有重点!!!!

3.有的图可能Astar会死循环,这时用Yen最好

K短路—无环_Astar

#definemaxn壹0壹0

#definemaxm壹000壹0

7

constintinf=0x3f3f3f3f;

typedefpair<intzint>T;

structTT{

intfirst,second,mask;//保证点的个数小于mask的范围(即30)

TT(intfirst,intsecond,intmask):first(first)rsecond(second),

mask(mask){}

);

structNod{

intb,val,next;

voidinit(intb,intval,intnext){

this->b=b;

this->val=val;

this->next=next;

}

);

structDijkstra{

intE[maxn],n;//图

Nodbuf[maxm];intlen;//资源

intd[maxn];//最短距离

voidinit(intn){

this->n=n;

memset(E,255,sizeof(E));

len=0;

}

voidaddEdge(inta,intb,intval){

buf[len].init(b,val,E[a]);E[a]=len++;

}

voidsolve(ints){

staticpriority_queue<Tzvector<T>zgreater<T>>q;

while(!q.empty())q.pop();

memset(d,63,sizeof(d));

d[s]=0;

q.push(T(0,s));

intu,du,v,dv;

while(!q.empty()){

u=q.top().second;

du=q.top().first;

q-pop();

if(du!=d[u])continue;

for(inti=E[u];i!=-壹;i=buf[i].next){

v=buf[i].b;

dv=du+buf[i].val;

if(dv<d[v]){

d[v]=dv;

q.push(T(dvzv));

)

)

)

}

};

Dijkstradij;

structcmp{

booloperator()(constTT&a,constTT&b)const{

if(a.first+dij.d[a.second]==b.first+dij.d[b.second])

returna.first>b.first;

returna.first+dij.d[a.second]>b.first+dij.d[b.second];

}

);

structAStar{//Astar求解k短路

intE[maxn]rn;//图

Nodbuf[maxm];intlen;//资源

intent[maxn];//记录次数

8

voidinit(intn){

this->n=n;

memset(E,255,sizeof(E));

len=0;

dij.init(n);

}

voidaddEdge(inta,intb,intval){

buf[len].init(b,val,E[a]);E[a]=len++;

dij.addEdge(b,a,val);

)

/**

*注释:

*壹.k=壹是最短路,以此类推

*2.k短路和k-壹短路可能相同!

*3.没有k短路返回-壹

*/

intsolve(ints,intt,intk){

if(s==t)k++;//假设两个点合并在一起不算路!!

staticpriority_queue<TT,vector<TT>zcmp>q;

while(!q.empty())q.pop();

dij.solve(t);

if(dij.d[s]==inf)return-壹;//根本就没有路!

intu,du,v,dv,mask;

memset(ent,0,sizeof(ent));

q.push(TT(0,s,4«s));//T.first是f(n),T.second是n

while(!q.empty()){

u=q.top().second;

du=q.top().first;

mask=q.top().mask;

q-pop();

ent[u]++;

//即当前是到u点的ent[u]短路

if(t==u){//松弛最后一个点

printf("%d",du);〃打印答案

if(ent[t]==k)returndu;

continue;//最后一个点不许松弛其他点!

}

//if(ent[u]>k)continue;//大于k,我不在需要你了!【不要这句话!!!】

for(inti=E[u];i!=-壹;i=buf[i].next){

v=buf[i].b;

dv=du+buf[i].val;

if(mask&(壹<<v))continue;

q.push(TT(dv,v,mask|(壹<<v)));//松弛伙伴!

)

)

return-壹;

)

}as;

//SOJ-327壹打印前k短路径长度

intmain(){

intn,s,t,tmp,MAX;

while(cin»n>>s»t>>MAX){

if(n>30)while(8);

as.init(n);

for(inti=0;i<n;i++){

9

for(intj=0;j<n;j++){

cin»tmp;

if(i!=j&&tmp!=MAX){

as.addEdge(i,j,tmp);

}

)

}

as•solve(s-壹,t-壹,n);

cout«endl;

)

return0;

}

K短路—无环_Yen

/**

*注意:

*壹.求【无环】【k短路径】

*2.不能有【重边】

★/

constintmaxn=30;

constintinf=0x3f3f3f3f;

typedefpair<intzint>T;

structNod{

intb,nxt,val;

voidinit(intb,intnxt,intval){

this->b=b;

this->nxt=nxt;

this->val=val;

)

);

structPath{

vector<int>node,block;

intlen;

//Theindexofthedeviationnode.Nodesbeforethisnodeareonthe

//kshortestpaths*tree.

intdev;

booloperator<(constPathsp)const{

returnlen>p.len;

)

);

structGraph{

intE[maxn],n;//图

Nodbuf[maxn*maxn];intlen;//资源

voidinit(intn){

this->n=n;

memset(Ez255,sizeof(E));

len=0;

memset(edge,255,sizeof(edge));

)

voidaddEdge(inta,intb,intv){

edge[a][b]=len;

buf[len].init(b,E[a],v);E[a]=len++;

}

//GettheklooplessshortestpathswithYEN*salgorithm.

//Iftwopathshavethesamelength,theonewhosereversedpath

vector<Path>yenLoopless(intsource,intsink,intk){

vector<Path>res;

priority_queue<Path>q;//candidate

memset(block,0,sizeof(block));

initSingleSrc(source);

10

dijkstra();

if(d[sink]<inf){

Pathsh=shortestPath(sink);

sh.dev=壹;

sh.block.push_back(sh.node[sh.dev]);

q.push(sh);

)

while(res.size()<k&&!q.empty()){

Pathpath=q.top();q.pop();

for(intdev=path.dev;dev<path.node.size();dev++){

intpre=path.node[dev-壹];

if(dev==path.dev){

for(inti=0;i<path.block.size();i++){

block[pre][path.block[i]]=true;

)

}else{

block[pre][path.node[dev]]=true;

)

initSingleSrc(source);

delSubpath(path,dev);

dijkstra();

if(d[sink]<inf){

PathnewP=shortestPath(sink);

newP.dev=dev;

if(dev==path.dev){

newP.block=path.block;

}else{

newP.block.push_back(path.node[dev]);

)

newP.block.push_back(newP.node[dev]);

q.push(newP);

}

)

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论