/*
- -
这题做了一天.....粗心害死人啊 题目描述恶心 数据更恶心...
先处理一下能走的边 能走的点(到这建边从终点跑一下.)
然后就是SPFA了 注意负环的判断
*/
#include<iostream>
#include<cstdio>
#include<cstring>
#include<queue>
#define maxn 1110
#define maxm 10010
#define inf 999999999
using namespace std;
int n,m,num,num2,head[maxn],s,t,vis[maxm];
int ans[maxm],size,f[maxn],falg,Dis[maxn],Ti[maxn];//ans存能走的边 并不是一个点对应一条边 要用maxm!
int sum[maxn],can[maxn],head2[maxn];
struct node
{int u,v,ti,si,pre;
}e[maxm],e2[maxm];
queue<int>q;
int init()
{int x=0;char s;bool f=0;s=getchar();while(s<'0'||s>'9'){if(s=='-')f=1;s=getchar();}while(s>='0'&&s<='9'){x=x*10+s-'0';s=getchar();}if(f)return -x;else return x;
}
void Add(int from,int to,int cost,int len)
{num++;e[num].u=from;e[num].v=to;e[num].si=len;e[num].ti=cost;e[num].pre=head[from];head[from]=num;
}
void Add2(int from,int to,int cost,int len)
{num2++;e2[num2].u=from;e2[num2].v=to;e2[num2].si=len;e2[num2].ti=cost;e2[num2].pre=head2[from];head2[from]=num2;
}
void Edge_can()//能走的边
{for(int i=0;i<=n;i++){int minn=inf,k;for(int j=head[i];j;j=e[j].pre)if(e[j].ti<minn)minn=e[j].ti;for(int j=head[i];j;j=e[j].pre)if(e[j].ti==minn)ans[++size]=j;}for(int i=1;i<=size;i++)vis[ans[i]]=1;
}
void Bfs(int x)
{queue<int>qi;qi.push(x);can[x]=1;while(!qi.empty()){int k=qi.front();qi.pop();for(int i=head2[k];i;i=e2[i].pre)if(can[e2[i].v]==0){qi.push(e2[i].v);can[e2[i].v]=1;}}
}
void Point_can()//到这建边搜能走的点
{for(int i=1;i<=num;i++)if(vis[i])Add2(e[i].v,e[i].u,e[i].ti,e[i].si);Bfs(t);
}
void SPFA(int st)
{q.push(st);f[st]=1;sum[st]++;Dis[st]=0;Ti[st]=0;while(!q.empty()){int now=q.front();q.pop();f[now]=0;if(sum[now]>n+5)//负环死循环
            {falg=1;break;}for(int i=head[now];i;i=e[i].pre)if((Ti[now]+e[i].ti<Ti[e[i].v]||(Ti[now]+e[i].ti==Ti[e[i].v]&&Dis[now]+e[i].si<Dis[e[i].v]))&&vis[i]&&can[e[i].v])//没有 f[e[i].v]==0 !!!
              {Ti[e[i].v]=Ti[now]+e[i].ti;Dis[e[i].v]=Dis[now]+e[i].si;if(f[e[i].v]==0){q.push(e[i].v);f[e[i].v]=1;sum[e[i].v]=sum[now]+1;    }}}
}
int main()
{while(~scanf("%d%d%d%d",&n,&m,&s,&t)){n--;memset(head,0,sizeof(head));memset(ans,0,sizeof(ans));//多组数据....注意初始化 memset(vis,0,sizeof(vis));memset(can,0,sizeof(can));memset(f,0,sizeof(f));memset(sum,0,sizeof(sum));memset(Dis,127/3,sizeof(Dis));memset(Ti,127/3,sizeof(Ti));memset(head2,0,sizeof(head2));size=0;num=0;falg=0;num2=0;int ui,vi,dis,cost1,cost2;for(int i=1;i<=m;i++){ui=init();vi=init();cost1=init();dis=init();cost2=init();Add(ui,vi,cost1,dis);Add(vi,ui,cost2,dis);}Edge_can();Point_can();if(can[s]==0)//跑不到终点
          {printf("VOID\n");continue;}SPFA(s);if(falg==1)printf("UNBOUND\n");//能跑到 并且有负环  if(falg==0)printf("%d %d\n",Ti[t],Dis[t]);}return 0;
}

转载于:https://www.cnblogs.com/yanlifneg/p/5485758.html

poj 2679 Adventurous Driving(SPFA 负环)相关推荐

  1. POJ 2679 Adventurous Driving

    SPFA算法 难点: 1. 起始点有自环, 不管正环或者负环, 都需要去判断是VOID还是UNBOUND; 2. 判断负权环是否存在于路径上;(这个算法我一开始想把SPFA某个点进队列次数大于2*n或 ...

  2. [SPFA负环]虚空之遗

    题目背景: 自从被异虫击溃,被迫逃离艾尔之后,星灵们就一直想要收复自己的家园.终于,机会来了!阿塔尼斯重新联合了圣堂武士和黑暗圣堂武士,将星灵的信仰牢牢的寄托在神圣的卡拉上,带领星灵的部队重返艾尔!而 ...

  3. #0/1分数规划,SPFA,负环#洛谷 1768 天路

    题目链接 分析 可以发现,这是一道0/1分数规划的题目,需要二分答案,然后判定是否存在负环,所以说bfs貌似不高效,那就用dfs吧,若二分答案为0,即不合法 代码 #include <cstdi ...

  4. 2679 Adventurous Driving 解题报告

    Memory: 324K Time: 0MS Language: G++ Faults:20 wa + ... Algorithm:最短路径 #include <stdio.h> #inc ...

  5. poj 2049(二分+spfa判负环)

    poj 2049(二分+spfa判负环) 给你一堆字符串,若字符串x的后两个字符和y的前两个字符相连,那么x可向y连边.问字符串环的平均最小值是多少.1 ≤ n ≤ 100000,有多组数据. 首先根 ...

  6. POJ 3259 Wormholes【最短路/SPFA判断负环模板】

    农夫约翰在探索他的许多农场,发现了一些惊人的虫洞.虫洞是很奇特的,因为它是一个单向通道,可让你进入虫洞的前达到目的地!他的N(1≤N≤500)个农场被编号为1..N,之间有M(1≤M≤2500)条路径 ...

  7. POJ - 3169 SPFA解差分约束除了有解,负环还有另一种情况

    题意就是有N头牛排成一个直线..有些牛之间互相讨厌..距离必须大于等于某个...有些牛之间相互暧昧..距离必须小于等于某个...牛的前后顺序和编号是一样的...问这些牛最多能排多长.. 比较传统的SP ...

  8. POJ 3259 Wormholes SPFA判负环

    思路:SPFA判负环 数组不要开太小-- (后面附一组测试数组) // by SiriusRen #include <queue> #include <cstdio> #inc ...

  9. AcWing 904. 虫洞(SPFA or Djakarta or bellman判负环)

    题目连接 http://poj.org/problem?id=3259 思路 大概是想问我们能不能找到一个负环,那么再看一眼数据范围,500,感觉乱搞都能过,但是出题人很恶心啊,n的范围并不是500, ...

最新文章

  1. jsp中九大内置对象
  2. CTF杂项题型之画图-Miscellaneous-200
  3. Python 学习第三部分函数——第一章函数基础
  4. Delphi使用ADO组件访问ACCESS数据入门例程
  5. C#代码创建Xml文件
  6. Mac OS使用技巧之八:Dock栏使用技巧
  7. 字符串的相关方法 2101 0310
  8. 华为Mate 30系列将升级25W无线快充:充电方面无对手
  9. oracle中时间、日期函数的总结
  10. 首款搭载国产CPU的域名服务器发布;iPhone彻底淘汰Lightning接口?ChromeOS 75发布 | 极客头条...
  11. jQuery Mobile中单选按钮radio的data-*选项
  12. MSF之IIS6WebDAV执行漏洞复现
  13. julia 使用修改后的pkg
  14. [整理]VS2010中文版配置opencv2.4.8
  15. 软件项目管理与过程改进 BB平台 题库整理
  16. Python数学计算工具3、Python 斐波那契数列-前500项列表
  17. Numpy IO:npy、npz
  18. php7安装fileinfo扩展
  19. 通过拼多多根据ID获取商品详情数据简易操作
  20. onvif wsdl2java

热门文章

  1. (学习)基于STM32的PWM控制直流电机转速(CubeMX+HAL库)
  2. mysql数据库concat拼接字符串乱码问题
  3. 会议OA项目之代开会议全部会议
  4. android定时启动关闭app,如何 定时启动你的Android App
  5. ThreadLocal、Volatile、synchronized、Atomic关键字扫盲
  6. Air系列模块驱动lcd显示
  7. 对 GPIOB_ODR|=(1<<10) GPIOB_ODR=~(1<<10)的理解
  8. 介绍下我的腾讯云+社区专栏
  9. supesite标签调用参数详解
  10. 【flowable】三、flowableUI应用