mygraph.docx
- 文档编号:4917441
- 上传时间:2022-12-11
- 格式:DOCX
- 页数:40
- 大小:25.52KB
mygraph.docx
《mygraph.docx》由会员分享,可在线阅读,更多相关《mygraph.docx(40页珍藏版)》请在冰豆网上搜索。
mygraph
目录
Kruskal1
单点度限制生成树4
最小树形图8
第K短路12
无向图最小环14
强联通分量15
双连通分量16
带上下届可行流18
最小费用最大流21
Kruskal
#defineES201000
#defineVS101000
#include
usingnamespacestd;
intn,m;
structedge{
intx,y,len;
}es[ES];
intf[VS];
boolcmp(edgea,edgeb){
returna.len } intgetf(intx){ if(f[x]! =x) f[x]=getf(f[x]); returnf[x]; } intkruskal(){ intans=0,l=0; for(inti=1;i<=n;i++) f[i]=i; for(intp=1;p<=m;p++){ if(getf(es[p].x)! =getf(es[p].y)){ ans+=es[p].len; l++; if(l==n-1) returnans; f[f[es[p].x]]=f[es[p].y]; } } return-1; } intmain(){ scanf("%d%d\n",&n,&m); for(inti=1;i<=m;i++) scanf("%d%d%d\n",&es[i].x,&es[i].y,&es[i].len); sort(es+1,es+m+1,cmp); printf("%d\n",kruskal()); return0; } 次小生成树 #defineinf1147483647 #defineN600 #defineVSN #defineES800000 #include #include #include #include usingnamespacestd; intn,m; structheapnode{ intid,w; heapnode(){ } heapnode(int_id,int_w): id(_id),w(_w){ } }; booloperator<(heapnodea,heapnodeb){ returna.w>b.w; } structedge{ intto,w; edge*next; }edges[ES]; intes=0; structGraph{ voidins(intx,inty,intw){ edge*t=&edges[++es]; t->to=y; t->w=w; t->next=tail[x]; tail[x]=t; mat[x][y]=min(mat[x][y],w); } Graph(){ init(); } voidinit(){ memset(tail,0,sizeof(tail)); memset(mat,127,sizeof(mat)); } intprim(); edge*tail[VS]; intmat[VS][VS]; }G; structTree{ voidins(intx,inty,intw){ edge*t=&edges[++es]; t->to=y; t->w=w; t->next=tail[x]; tail[x]=t; } intsub_spaning_tree(){ intret=inf; for(inti=1;i<=n;i++){ intt=bfs(i); if(t ret=t; } returnret; } intbfs(intB){ intret=inf; queue boolvis[VS]; memset(vis,0,sizeof(vis)); Q.push(B); while(Q.empty()==false){ intt=Q.front(); Q.pop(); for(edge*p=tail[t];p;p=p->next){ intto=p->to; if(! vis[to]){ W[B][to]=max(p->w,W[B][t]); if(ret>G.mat[B][to]-W[B][to]&&B! =t) ret=G.mat[B][to]-W[B][to]; vis[to]=true; Q.push(to); } } } returnret; } voidinit(){ memset(tail,0,sizeof(tail)); } Tree(){ init(); } edge*tail[VS]; intW[N][N]; }T; voidinput(){ G.init(); T.init(); scanf("%d%d",&n,&m); for(inti=1;i<=m;i++){ intx,y,w; scanf("%d%d%d",&x,&y,&w); G.ins(x,y,w); G.ins(y,x,w); } } intGraph: : prim(){ priority_queue intdis[N]; boolvis[N]; intpre[N]; intret=0; memset(vis,0,sizeof(vis)); memset(dis,127,sizeof(dis)); Q.push(heapnode(1,0)); dis[1]=0; pre[1]=-1; for(inti=1;i<=n;i++){ heapnodet; Q.push(heapnode(0,2147483647)); for(t=Q.top(),Q.pop();vis[t.id];Q.top(),Q.pop()) ; if(! t.id) return-1; if(pre[t.id]>0){ T.ins(pre[t.id],t.id,t.w); T.ins(t.id,pre[t.id],t.w); } vis[t.id]=true; ret+=t.w; for(edge*p=tail[t.id];p;p=p->next){ intto=p->to; if(dis[to]>p->w){ dis[to]=p->w; Q.push(heapnode(to,p->w)); pre[to]=t.id; } } } returnret; } intmain(){ freopen("x.in","r",stdin); input(); intt=G.prim(); intsT=T.sub_spaning_tree(); cout<<"Cost: "< cout<<"Cost: "; if(sT==inf) cout<<-1< else cout< return0; } 单点度限制生成树 //#defineDE #defineinf1047483647 #defineVS40 #defineES800 #include #include #include #include #include usingnamespacestd; structnameid{ intoperator[](strings){ if(list.find(s)! =list.end()) returnlist[s]; list[s]=++size; #ifdefDE Name[size]=s; #endif returnsize; } map nameid(): size(0){ } intsize; #ifdefDE stringName[VS]; #endif }ID; structTree{ voidins(intx,inty,intw){ mat[x][y]=w; mat[y][x]=w; } voiddel(intx,inty){ mat[x][y]=-1; mat[y][x]=-1; } Tree(){ memset(mat,-1,sizeof(mat)); } intmat[VS][VS]; }; structt_edge{ intx,y,w; t_edge(){ } t_edge(inta,intb,intc): x(a),y(b),w(c){ } }; boolcmp(t_edgea,t_edgeb){ returna.w } structGraph{ t_edgeedges[ES]; TreesubT; intmat[VS][VS]; intlb[VS]; boolvis[VS]; boolused[VS]; intf[VS]; intRoot; intlbs; intes; intminid,mindeta,minX,minY; intmakelab(){ intret=0; lbs=0; memset(vis,false,sizeof(vis)); mat[0][Root]=inf; mat[Root][0]=inf; for(inti=2;i<=ID.size;i++) if(! vis[i]){ intj=0; dfs(i,++lbs,j); used[j]=true; subT.ins(Root,j,mat[Root][j]); ret+=mat[Root][j]; } returnret; } voiddfs(intid,intlab,int&minp){ if(mat[Root][id]>0&&mat[Root][id] minp=id; vis[id]=true; lb[id]=lab; for(inti=1;i<=ID.size;i++){ if(i==Root) continue; if(! vis[i]&&mat[id][i]>0) dfs(i,lab,minp); } } intgf(intx){ if(f[x]! =x) f[x]=gf(f[x]); returnf[x]; } intkruskal(){ sort(edges+1,edges+1+es,cmp); intret=0,cnt=0; for(inti=1;i<=ID.size;i++) f[i]=i; for(inti=1;i<=es;i++){ intx=edges[i].x,y=edges[i].y; if(x==Root||y==Root) continue; if(gf(x)! =gf(y)){ f[gf(x)]=gf(y); ret+=edges[i].w; subT.ins(x,y,edges[i].w); if(++cnt==ID.size-1-lbs) break; } } returnret; } voidinit(){ memset(mat,-1,sizeof(mat)); es=0; Root=ID["Park"]; } voidins(intx,inty,intw){ mat[x][y]=w; mat[y][x]=w; edges[++es]=t_edge(x,y,w); } voiddfs(intu,intpre,intmaxwid,intw){ vis[u]=true; for(inti=1;i<=ID.size;i++){ if(! vis[i]&&subT.mat[u][i]>0&&i! =Root){ inttmaxwid=maxwid,tw=w,tpre=pre; if(mat[u][i]>w) tw=mat[u][i]; if(tw>w){ tpre=u; tmaxwid=i; } if(mat[Root][i]>0&&mindeta>-tw+mat[Root][i]&&! used[i]){ minid=i; mindeta=-tw+mat[Root][i]; minX=tpre; minY=tmaxwid; } dfs(i,tpre,tmaxwid,tw); } } } intKlimitspanningtree(intlimT){ intret,ans=makelab(); ans+=kruskal(); ret=ans; for(intk=lbs+1;k<=limT;k++){ memset(vis,false,sizeof(vis)); mindeta=inf; for(inti=1;i<=ID.size;i++){ if(used[i]) dfs(i,0,0,0); } if(mindeta>=0) continue; subT.ins(Root,minid,mat[Root][minid]); subT.del(minX,minY); used[minid]=true; ans+=mindeta; if(ret>ans) ret=ans; } returnret; } Graph(){ init(); } }G; intmain(){ freopen("x.in","r",stdin); intn,lim; cin>>n; for(inti=1;i<=n;i++){ strings1,s2; intw; cin>>s1>>s2>>w; G.ins(ID[s1],ID[s2],w); G.ins(ID[s2],ID[s1],w); } cin>>lim; cout<<"Totalmilesdriven: "< #ifdefDE G.subT.show(); #endif return0; } 最小树形图 doubleconstoo=1e8; doubleg[103][103]; intpre[103],vis[103],del[103]; intN,M; inlinevoidupdate(double&x,doubley){ if(y x=y; } doubleMinTreeGraph(){ memset(del,0,sizeof(del)); doubleret=0; while(true){ intcheck=1; for(inti=2;i<=N;i++){ if(del[i]) continue; pre[i]=i,g[i][i]=oo; for(intj=1;j<=N;j++){ if(del[j]) continue; if(g[j][i] pre[i]=j; } } for(inti=2;i<=N;i++){ if(del[i]) continue; memset(vis,0,sizeof(vis)); intnode=i; while(node! =1&&! vis[node]){ vis[node]=1,node=pre[node]; } if(node==1) continue; check=0; intt=node; ret+=g[pre[node]][node]; node=pre[node]; while(node! =t){ ret+=g[pre[node]][node],del[node]=1,node=pre[node]; } for(intj=1;j<=N;j++){ if(del[j]) continue; if(g[j][t]! =oo) g[j][t]=g[j][t]-g[pre[t]][t]; } node=pre[t]; while(node! =t){ for(intk=1;k<=N;k++){ if(del[k]) continue; update(g[t][k],g[node][k]); if(g[k][node]! =oo) update(g[k][t],g[k][node]-g[pre[node]][node]); } node=pre[node]; } break; } if(check){ for(inti=2;i<=N;i++){ if(del[i]) continue; ret+=g[pre[i]][i]; } break; } } returnret; } Dijkstra #defineVS101001 #defineES201001 #defineINT_MAX0x7f7f7f7f #include #include #include #include usingnamespacestd; intdis[VS]; inttail[VS]; intpre[2*ES]; intto[2*ES]; intlen[2*ES]; intes=0; intn,m; structqE{ intlen,idx; qE(intl,inti): len(l),idx(i){ } qE(){ } }; booloperator<(constqE&a,constqE&b){ returna.len>b.len; } voidaddedge(intx,inty,intt){ pre[++es]=tail[x]; len[es]=t; to[es]=y; tail[x]=es; } voidinit(){ memset(pre,-1,sizeof(pre)); memset(tail,-1,sizeof(pre)); } intdijkstra(ints,intt){ priority_queue memset(dis,127,sizeof(dis)); Q.push(qE(0,s)); dis[s]=0; while(! Q.empty()){ qEt; do{ t=Q.top(); Q.pop(); }while(dis[t.idx]! =t.len&&! Q.empty()); for(intp=tail[t.idx];p>0;p=pre[p]){ if(dis[to[p]]>t.len+len[p]){ dis[to[p]]=t.len+len[p]; Q.push(qE(dis[to[p]],to[p])); } } } if(dis[t]==INT_MAX) return-1; returndis[t]; } intmain(){ init(); scanf("%d%d",&n,&m); for(inti=1;i<=m;i++){ intx,y,t; scanf("%d%d%d",&x,&y,&t); addedge(x,y,t); addedge(y,x,t); } printf("%d\n",dijkstra(1,n)); r
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- mygraph
![提示](https://static.bdocx.com/images/bang_tan.gif)