博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
SPFA算法模板
阅读量:6526 次
发布时间:2019-06-24

本文共 1765 字,大约阅读时间需要 5 分钟。

1 #include
2 #include
3 #include
4 #include
5 #include
6 using namespace std; 7 const int inf=1<<29; 8 const int maxn=1100; 9 const int maxm=maxn*maxn;10 int e,pnt[maxm],head[maxn],nxt[maxm],cost[maxm];11 int dist[maxn],pre[maxn],cnt[maxn];12 int n,m;13 bool vis[maxn];14 queue
q;15 void add(int u,int v,int c)16 {17 pnt[e]=v;18 nxt[e]=head[u];19 cost[e]=c;20 head[u]=e++;21 }22 bool Spfa(int st)23 {24 for(int i=0; i<=n; i++)25 dist[i]=inf;26 dist[st]=0;27 q.push(st);//入队28 while(!q.empty())//循环一直到空29 {30 int u=q.front();//队顶31 q.pop();//出队32 vis[u]=0;//标记已经出队;33 for(int i=head[u]; i!=-1; i=nxt[i])//与顶点为u所连接的点进行松弛34 if(dist[pnt[i]]>dist[u]+cost[i])35 {36 pre[pnt[i]]=u;//把该点前驱 记录下来37 dist[pnt[i]]=dist[u]+cost[i];//进行松弛操作38 if(!vis[pnt[i]])//不在队中39 {40 if(++cnt[pnt[i]]==n)//假如某点一直进队,就一直被松弛,松弛次数大于等于n时,则存在负权回路41 return true;42 q.push(pnt[i]);//入队43 vis[pnt[i]]=1;//标记在队中44 }45 }46 }47 return false;48 }49 void DFS(int u)50 {51 if(pre[u]==-1)52 {53 printf("%d",u);54 return;55 }56 DFS(pre[u]);57 printf("->%d",u);58 }59 int main()60 {61 while(~scanf("%d%d",&n,&m))//点数,边数62 {63 e=0;64 memset(head,-1,sizeof(head));65 memset(cnt,0,sizeof(cnt));//判断是否有负权回路66 memset(pre,-1,sizeof(pre));//存路径(前缀)67 memset(vis,0,sizeof(vis));//标记该数是否已经在队里了68 while(m--)69 {70 int u,v,c;71 scanf("%d%d%d",&u,&v,&c);72 add(u,v,c);73 add(v,u,c);74 }75 if(Spfa(1))76 printf("-1\n");77 else78 {79 for(int i=2; i<=n; i++)80 {81 printf("sss %d %d\n",i,dist[i]);82 DFS(i);83 printf("\n");84 }85 }86 }87 }

测试数据

7 12

1 2 24
1 3 8
1 4 15
2 5 6
3 5 7
3 6 3
4 7 4
5 7 9
6 5 2
6 7 3
6 4 5
7 2 3

转载于:https://www.cnblogs.com/tianmin123/p/4788792.html

你可能感兴趣的文章
cocos2d-x 3.1.1 学习笔记[13] listen 监听器
查看>>
WTL介绍
查看>>
应用程序框架实战三十四:数据传输对象(DTO)介绍及各类型实体比较(转)
查看>>
放量滞涨,抛出信号
查看>>
linux主机下的Vmware Workstation配置NAT设置 端口映射-Ubuntu为例
查看>>
unity physics joint
查看>>
TD的访问地址
查看>>
一张图看懂normal,static,sealed,abstract 的 区别
查看>>
Task的使用
查看>>
s:iterator巧妙控制跳出循环
查看>>
Serv-U 的升级及数据备份和迁移【转】
查看>>
webstorm无法显示左边文件夹目录的解决方法
查看>>
数字校园-云资源平台 2014.10.26-人人通共享空间
查看>>
为你的网站加上SSL,可以使用HTTPS进行访问
查看>>
软件project--谈项目开发
查看>>
在Android中创建文件
查看>>
爬虫基础
查看>>
JS组件系列——再推荐一款好用的bootstrap-select组件,亲测还不错
查看>>
getopt--parse command line options
查看>>
闭包和OC的block的本质
查看>>