poj-1125-Stockbroker Grapevine spfa模板
2016-01-10 22:07
393 查看
本模板无判断负环部分,
判断负环方法记录每个点压队列次数 若有一大于V则存在负环
判断负环方法记录每个点压队列次数 若有一大于V则存在负环
#include<cstdio> #include<queue> #include<algorithm> #include<iostream> #include<cstring> #define maxx 999999999 using namespace std; struct edge{ int x,y,dis,next; }e[11000]; int head[11000],n,m,l1,dequeue[1000],v[1000]; void init() { for(int i=1;i<=n;i++) head[i] = -1; } void add(int pre,int to,int dis) { e[l1].x = pre; e[l1].y = to; e[l1].dis= dis; e[l1].next = head[pre]; head[pre] = l1; l1++; } int spfa(int star) { memset(dequeue,0,sizeof(dequeue)); for(int i=1;i<=n;i++) v[i] = maxx; v[star] =0; queue<int>qu; qu.push(star); dequeue[star] = 1; while(!qu.empty()) { int qu1 = qu.front(); qu.pop(); for(int i = head[qu1];i!=-1;i = e[i].next){ if(v[e[i].y]>v[e[i].x]+e[i].dis){ v[e[i].y] = v[e[i].x]+e[i].dis; if(!dequeue[e[i].y]){ qu.push(e[i].y); dequeue[e[i].y] = 1; } } } dequeue[qu1] = 0; } int ss =-1; for(int i=1;i<=n;i++) if(v[i]>ss)ss = v[i]; return ss; } int main() { while(scanf("%d",&n)&&n) { init(); l1 = 0; for(int i=1;i<=n;i++) { int m; scanf("%d",&m); while(m--){ int a,b; scanf("%d%d",&a,&b); add(i,a,b); } } int minn = maxx,minnx; for(int i=1;i<=n;i++) { int s = spfa(i); if(s<minn){minn = s;minnx = i;} } if(minn == maxx)printf("disjoint\n"); else printf("%d %d\n",minnx,minn); } return 0; }
相关文章推荐
- javascript的特点
- rtmp发送H264及aac的音视频
- 使用adapter的notifyDataSetChanged时列表数据没有刷新
- 雷锋举报了快播
- 浅析多线程
- synchronized 用法总结
- Servlet3.0注解新特性笔记 (转载IBM)
- HPU:1879畅通工程(kruskal)
- document.body.scrollTop用法
- 触摸事件
- PPAPI插件与浏览器的交互过程
- 使用gdb调试Nginx worker进程
- UIScreen、UIWindow、UIView浅析
- 面试经历---YY欢聚时代(2015年11月21日上午初试、25日下午复试)
- Crazepony软件框架讲解
- 2016第一周日
- poj-2240- Arbitrage bellmanfoyd 模板
- 【iOS】Quartz 2D图片压缩和裁剪
- 史上最全的推广渠道(值得收藏)
- 学习Android从0开始之基础篇(4)-TextView与EditText