HDU 2680(spfa)
2015-08-04 10:08
183 查看
题意:有多个起点,求到终点的最短路,一个个求的话很明显会超时。有两种写法:
一,构建一个超级源点,与起点相连,距离为0,从0开始搜。然后套模板即可。
二,构建反向图,以终点为起点开始搜。
下面是我用第一种思路套的spfa 的模板。。写的有点丑
一,构建一个超级源点,与起点相连,距离为0,从0开始搜。然后套模板即可。
二,构建反向图,以终点为起点开始搜。
下面是我用第一种思路套的spfa 的模板。。写的有点丑
#include<stdio.h> #include<string.h> #include<queue> using namespace std; const int N=1100; const int M=22000; const int INF=0x3f3f3f3f; int d ,p ,cnt ,n,js; vector<int> g ; struct node { int v,w; }e[M]; void add(int u,int v,int w) { e[js].v=v,e[js].w=w; g[u].push_back(js++); } void init() { for(int i=0;i<=n;i++) { d[i]=INF; g[i].clear(); } memset(p,0,sizeof(p)); memset(cnt,0,sizeof(cnt)); js=0; } int spfa(int s) { queue<int> q; int u,v,w,i; q.push(s),d[s]=0,p[s]=1,cnt[s]=1; while(!q.empty()) { p[u=q.front()]=0; q.pop(); for(i=0;i<g[u].size();i++) { v=e[g[u][i]].v,w=e[g[u][i]].w; if(d[u]+w<d[v]) { d[v]=d[u]+w; if(!p[v]) { if(++cnt[v]>n) return 0; p[v]=1; q.push(v); } } } } return 1; } int main() { int m,i,u,v,w,t; while(scanf("%d%d%d",&n,&m,&t)!=EOF) { n++; init(); while(m--) { scanf("%d%d%d",&u,&v,&w); add(u,v,w); } scanf("%d",&m); while(m--) { scanf("%d",&v); add(0,v,0); } if(spfa(0)) { if(d[t]==INF) printf("-1\n"); else printf("%d\n",d[t]); } else printf("-1\n"); } return 0; }
相关文章推荐
- 多校 hdu 5305
- linux 之 mysql问题
- darwin转发时,摄像机在3G和4G模式下的参数设置
- objective-c中的方法重载
- google protocol buffer (C++,Java序列化使用实例)
- 关于C语言中二级指针的理解
- Android学习心得(10) --- MAC下Android反编译(2)
- Visual Studio 2015 速递(4)——高级特性之移动开发
- jQuery左侧图片右侧文字滑动切换代码
- This is python
- 南邮 OJ 1060 接苹果
- 工厂方法模式-Factory Pattern
- lvs、haproxy、nginx 负载均衡的比较分析
- 如何在 Ubuntu 上比较 PDF 文件
- Web Service修炼之二Xfire+Spring
- bc第八场Reading comprehension(快速幂,数模公式)
- MapReduce实现计数
- 阿里巴巴影业面试总结
- 用例规约
- Linux防火墙Iptables设置