蓝桥杯练习试题4算法提高道路航路代码_第1页
蓝桥杯练习试题4算法提高道路航路代码_第2页
蓝桥杯练习试题4算法提高道路航路代码_第3页
蓝桥杯练习试题4算法提高道路航路代码_第4页
蓝桥杯练习试题4算法提高道路航路代码_第5页
全文预览已结束

付费下载

下载本文档

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

文档简介

C++

#include<iostream>#include<cstdio>#include<cstring>#include<algorithm>#include<queue>#include<stack>#include<vector>

#defineclr(a,b)memset(a,b,sizeof(a))usingnamespacestd;

constintN=25050;constintE=150500;

//邻接表

inth[N],v[E],w[E],nxt[E],el;voidinitEdge(){

clr(h,-1);el=0;

}

voidaddEdge(intx,inty,intz){

v[el]=y;w[el]=z;nxt[el]=h[x];h[x]=el++;

}

//belong[i]表示节点i所在的强连通分量;

//cnt表示强连通分量的个数;

intdfn[N],sta[N],low[N],belong[N];inttop,cnt,ind,n;

boolvis[N];

voidTarjanSolve(intu)

{dfn[u]=low[u]=++ind;vis[u]=true;

sta[++top]=u;

for(intp=h[u];~p;p=nxt[p])

{inti=v[p];if(!dfn[i]){

TarjanSolve(i);

if(low[i]<low[u])low[u]=low[i];

}

else

if(vis[i]&&dfn[i]<low[u])low[u]=dfn[i];

}

if(dfn[u]==low[u]){

++cnt;while(1){

inti=sta[top--];vis[i]=false;belong[i]=cnt;if(i==u)break;

}

}

}

voidTarjan(){//注意节点是从几开始存的clr(dfn,0);

clr(vis,0);

top=cnt=ind=0;

for(inti=1;i<=n;i++)//这里节点从1开始存,若从0开始存要改这里

if(!dfn[i])TarjanSolve(i);

}

structEDGE{

intu,v,w;boolflag;EDGE(){}

EDGE(intx,inty,intz,boolf):u(x),v(y),w(z),flag(f){}

} edge[E];intedgel;

boolvisitable[N];

voiddfs(intx){

visitable[x]=true;

for(inti=h[x];~i;i=nxt[i]){

if(!visitable[v[i]])

{dfs(v[i]);

}

}

}

intindegree[N];

//链表

intlh[N],lel,lv[E],lnxt[E];voidinitLink(){

clr(lh,-1);lel=0;

}

voidaddLink(intx,inty){

lv[lel]=y;lnxt[lel]=lh[x];lh[x]=lel++;

}

intdis[N];booltag[N];

intmain(){

intr,p,s;

while(~scanf("%d%d%d%d",&n,&r,&p,&s))

{clr(visitable,0);initEdge();

edgel=0;intx,y,z;

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

{scanf("%d%d%d",&x,&y,&z);addEdge(x,y,z);

addEdge(y,x,z);

edge[edgel++]=EDGE(x,y,z,false);

}

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

{scanf("%d%d%d",&x,&y,&z);addEdge(x,y,z);

edge[edgel++]=EDGE(x,y,z,true);

}

Tarjan();

dfs(s);initEdge();initLink();clr(indegree,0);

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

if(visitable[edge[i].u]&&visitable[edge[i].v])

{addEdge(edge[i].u,edge[i].v,edge[i].w);if(edge[i].flag){

++indegree[belong[edge[i].v]];addLink(belong[edge[i].v],edge[i].v);

}else{

addEdge(edge[i].v,edge[i].u,edge[i].w);

}

}

}

stack<int>zeroDegree;

priority_queue<pair<int,int>>que;clr(vis,false);

clr(tag,false);clr(dis,0x3f);dis[s]=0;

que.push(make_pair(0, s));while(!que.empty()||!zeroDegree.empty()){

if(que.empty()){

intx=zeroDegree.top();zeroDegree.pop();for(inti=lh[x];~i;i=lnxt[i]){

inty=lv[i];if(!vis[y]){

vis[y] = true;que.push(make_pair(-dis[y],y));

}

}

}else{

intx=que.top().second;que.pop();if(tag[x])continue;

tag[x] =true;

for(inti=h[x];~i;i=nxt[i])

{inty=v[i];

if(!tag[y]&&dis[y]>dis[x]+w[i])

{dis[y]=dis[x]+w[i];if(belong[x]==belong[y]){

que.push(make_pair(-dis[y],y));

}

}

if(belong[x]!=belong[y]){

--indegree[belong[y]];if(indegree[belong[y]]==0){

温馨提示

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

最新文档

评论

0/150

提交评论