ImageVerifierCode 换一换
格式:DOCX , 页数:22 ,大小:20.73KB ,
资源ID:6517159      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/6517159.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(ACM图论模版.docx)为本站会员(b****6)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

ACM图论模版.docx

1、ACM图论模版图论网络流模版#include#include#includeusing namespace std ;#define M 220#define INF 20000000struct node int from , to , dis ; int nest ;qeM*100 ;int handM , queM , staM;int n , m , len ;int disM ;void ab( int u , int v , int w ) qelen.from = u ; qelen.to = v ; qelen.dis = w ;qelen.nest = handu ;hand

2、u = len+ ; qelen.from = v ; qelen.to = u ; qelen.dis = 0 ;qelen.nest = handv ;handv = len+ ;int dinic( int st , int et ) int ans = 0 ; int front , tail ; int u , v , i; while(1) front = tail = 0 ; memset( dis , -1 , sizeof(dis ) ) ; quetail+ = st ;disst = 0 ; while( front 0 ) disu = disx + 1 ; queta

3、il+ = u ; if( u = et ) front = tail ; break ; if( diset = -1 ) break ; int t = 0 ; int s = st ; while( 1 ) if( s != et ) int i ; for( i = hands ; i != -1 ; i = qei.nest ) if( qei.dis 0 & disqei.to = disqei.from + 1 ) break ; if( i != -1 ) stat+ = i ; s = qei.to ; else if( t = 0 ) break ; disqesta-t.

4、to = -1 ; s = qestat.from ; else int min = INF ; int now ; for( int i = 0 ; i qestai.dis) min = qestai.dis ; now = i ; ans += min ; for( int i = 0 ; i t ; i+) qestai.dis -= min ; qestai1.dis += min ; s = qestanow.from ; t = now ; return ans ;int main() int i , j , u , v , w ; while( scanf( %d%d , &n

5、 , &m ) != EOF ) memset( hand , -1 , sizeof(hand ) ; len = 0 ; for( i = 0 ; i n ;i+) scanf( %d%d%d , &u , &v , &w ) ; ab( u , v , w ) ; cout dinic( 1 , m ) endl ; 差分约束/用SPFA解差分方程,用最短路径求差分方程的最大解;用最长路径求差分方程的最小解.#include#include#include#include#include#define maxn 50010#define INF 20000000using namespa

6、ce std ;/dt+1-ds = c,也就是distt+1 = dists + c,/dise-diss = c 也就是 dise-diss c 不能成立 / 也就是最长路松弛技术/这是求最长路的形式,所以要求最长路 / 看形势struct node int to ,next , val ;edgemaxn*3 ;int headmaxn , top ,dmaxn ;bool vimaxn ;void Unit( int u , int v , int val ) edgetop.next = headu ; edgetop.to = v ; edgetop.val = val ;head

7、u = top+ ;void spfa( int Min , int Max ) int i , j , now ; int u , w ; memset( vi , 0 , sizeof(vi) ) ; queueq ; for( i = Min ; i = Max ;i+ ) di = -INF ;/ 因为求最长路 dMin = 0 ; q.push( Min ) ; viMin = 1 ; while( !q.empty() now = q.front( ) ; q.pop( ) ; /cout now endl; for( i = headnow ; i != -1 ; i = edg

8、ei.next ) u = edgei.to ; w = edgei.val ; if( du w + dnow ) du = w + dnow ; if(!viu) q.push( u ) ; viu= 1 ; vinow = 0 ; int main() int i , n , m , j ; int Min ,Max,u,v,w ; / freopen(in.txt,r,stdin) ; while( scanf(%d , &n ) != EOF ) Max = 0 ;Min = INF ; top = 0 ; memset(head,-1,sizeof(head) ; for( i =

9、 1 ; i Max ) Max = v+1 ; if( u Min ) Min = u ; for( i = Min ; i Max ; i+) Unit(i+1,i,-1) ; Unit(i,i+1,0) ; spfa(Min,Max) ; cout dMax endl ; return 0 ;次小最短路和方法数#define INF 100000002typedef pair pii ;vectorqeMAXN ;void dfs( int n , int s , int e ) int i , min , j , u ,w , k ; int now , v ; memset( vi

10、, 0 ,sizeof(vi) ) ; memset( mun , 0 , sizeof(mun) ) ; for( i = 1 ; i = n ;i+) di0 = INF ; di1 = INF ; ds0 = 0 ; muns0 = 1 ; for( j = 1 ; j 2 * n ;j+)/ 因为是求两者所以 2*n - 1 次 min = INF ; for( i = 1; i = n ;i+) if( !vii0 & di0 min ) min = di0 ; now = 0 ; k = i ; / 也可以使次短路出队 else if( !vii1 &di1 min ) min =

11、 di1 ; now = 1 ; k = i ; if( min = INF ) break ; viknow = 1 ; for( i = 0 ; i min + w ) du1 = du0 ; munu1 = munu0 ; /注意更新次序 du0 = min + w ; munu0 = munknow ; else if( du0 = min + w ) munu0 += munknow ; / 如果大于次短路则更新 else if( du1 min + w ) du1 = min + w ; munu1 = munknow ; else if( du1 = min + w ) munu

12、1 += munknow ; int main() int i , j , n , m , T ; int u , v ,w , s ,e; scanf( %d , &T ) ; while( T- ) scanf( %d%d , &n , &m ) ; for( i = 1 ; i = n ;i+) qei.clear() ; while(m-) / 竟然是有向图! scanf( %d%d%d ,&u , &v, &w ) ; qeu.push_back(make_pair(v,w) ) ; scanf( %d%d , &s , &e ); dfs( n , s , e ) ; / 如果次短

13、比最短多一则把它加上 if( de0 + 1 = de1 ) mune0 += mune1 ; printf( %dn , mune0 ) ; 边双联通void dfs( int u , int fa ) int v ,i , k ; preu = lowu = +dfs_time ; for( i = headu ; i != -1 ;i = next1i) v = toi ; if(!prev) dfs(v,u) ; lowu = min(lowu,lowv) ; else if( prev preu & v != fa ) lowu = min(lowu,prev) ; void dfs

14、1( int u ) int i , v ; viu = 1 ; for( i = headu ; i != -1 ;i = next1i ) v = toi ; if( lowv != lowu) inlowu+ ; if(viv)continue ; dfs1(v) ; void Unit( int u , int v ) next1top = headu ; totop = v ; headu = top+ ; next1top = headv ; totop = u ; headv = top+ ;int main() int i , n , m , j , k ,case1 = 0

15、; int u , v ,ans ; / freopen(in.txt,r,stdin) ; while( scanf(%d%d ,&n ,&m ) != EOF ) memset(head,-1,sizeof(head) ; memset(pre,0,sizeof(pre) ; memset(in,0,sizeof(in) ; memset(vi,0,sizeof(vi) ; top = dfs_time = ans = 0; while(m-) scanf(%d%d , &u , &v ) ; Unit(u,v) ; ; dfs(1,-1) ; dfs1(1) ; memset(vi,0,

16、sizeof(vi) ; for( i = 1 ; i = n ;i+)if(inlowi = 1 & !vilowi) vilowi = 1 ; ans+ ; /树添加(ye+1)/2 就成为bian双联通 cout (ans+1)/2 endl ; return 0;强联通分量void dfs( int u ) preu = lowu = +dfs_time ; int i , v ; s.push(u) ; viu = 1 ; for( i = 0 ; i qeu.size() ; i+ ) v = qeui ; if(!prev) dfs(v) ; lowu = min(lowu,lo

17、wv) ; if( viv & prev lowu) lowu = prev ; if(preu = lowu) cnt+ ; while(1) v = s.top() ; s.pop() ; sccv = cnt ; viv = 0 ; if(v=u) break ; return ;int main() int i , n , m , k , j ; / freopen(in.txt,r,stdin) ; while( scanf(%d , &n ) != EOF ) for( i = 1 ; i = n ;i+ ) qei.clear() ; while(1) scanf(%d , &m

18、 ) ; if(!m) break ; qei.push_back(m) ; cnt = dfs_time = 0 ; memset(pre,0,sizeof(pre) ; memset(vi,0,sizeof(vi) ; while(!s.empty()s.pop() ; for( i = 1 ; i = n ;i+ ) if(!prei) dfs(i) ; if(cnt = 1)/注意 cout 1n0 endl ; continue ; memset(in,0,sizeof(in) ; memset(out,0,sizeof(out) ; for( i = 1; i = n ;i+ )

19、for( j = 0 ; j qei.size() ; j+ ) m = qeij ; if(sccm != scci) insccm+ ; outscci+ ; int sum1 = 0 , sum2 = 0 ; for( i = 1 ; i = cnt ;i+ ) if(outi = 0 )sum2+ ; if(ini = 0) sum1+ ; cout sum1 n max(sum1,sum2) endl ; return 0 ;求割点 void dfs( int u ) preu = lowu = +dfs_time ; int i , v ; viu = true ; for( i

20、= 0 ; i = preu & u != 1) sou+ ; else if( u = 1 )cnt+ ; else lowu = min(lowu,prev) ; int main() int i , n , m , k , j ; int u , v ; char a; freopen(in.txt,r,stdin) ; while( scanf(%d , &n ) & n ) for( i = 1 ; i = n ;i+) qei.clear() ; while( scanf(%d , &u ) & u ) while(getchar() != n) scanf(%d , &v ) ;

21、 qeu.push_back(v) ; qev.push_back(u) ; cnt = dfs_time = 0 ; memset(pre,0,sizeof(pre) ; memset(vi,0,sizeof(vi) ; memset(so,0,sizeof(so) ; dfs(1) ; int sum1 = 0 ; for( i = 1 ; i 1) sum1+ ; cout sum1 endl ; return 0 ;割边+最长路#pragma comment(linker, /STACK:1024000000,1024000000)using namespace std;void Un

22、it( int u , int v ) next1top = headu ; totop = v ; headu = top+ ; next1top = headv ; totop = u ; headv = top+ ; void dfs( int u , int fa ) int v ,i ,cnt1 = 0; int x = u ; dpu0 = dpu1 = 0 ; preu = lowu = +dfs_time ; for( i = headu ; i != -1 ; i = next1i) v = toi ; if(!prev) dfs(v,u) ; lowu = min(lowu

23、,lowv) ; if(preu lowv) cnt+ ; int tt=dpv0+(prexdpx0) dpx1=dpx0;dpx0=tt; else if(ttdpx1) dpx1=tt; else if( v = fa ) if(cnt1) lowu = min(lowu,prev) ; cnt1+ ; else lowu = min(lowu,prev) ; int main() int n , m , i ,j; int u ,v ; /freopen(in.txt,r,stdin) ; while( scanf(%d%d,&n ,&m ) != EOF ) if(n+m=0)break; mem

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1