/*
- -
这题做了一天.....粗心害死人啊 题目描述恶心 数据更恶心...
先处理一下能走的边 能走的点(到这建边从终点跑一下.)
然后就是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=;char s;bool f=;s=getchar();
while(s<''||s>''){if(s=='-')f=;s=getchar();}
while(s>=''&&s<=''){x=x*+s-'';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=;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=;i<=size;i++)vis[ans[i]]=;
}
void Bfs(int x)
{
queue<int>qi;
qi.push(x);
can[x]=;
while(!qi.empty())
{
int k=qi.front();
qi.pop();
for(int i=head2[k];i;i=e2[i].pre)
if(can[e2[i].v]==)
{
qi.push(e2[i].v);
can[e2[i].v]=;
}
}
}
void Point_can()//到这建边搜能走的点
{
for(int i=;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]=;
sum[st]++;
Dis[st]=;
Ti[st]=;
while(!q.empty())
{
int now=q.front();
q.pop();
f[now]=;
if(sum[now]>n+)//负环死循环
{
falg=;
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]==)
{
q.push(e[i].v);
f[e[i].v]=;
sum[e[i].v]=sum[now]+;
}
}
}
}
int main()
{
while(~scanf("%d%d%d%d",&n,&m,&s,&t))
{
n--;
memset(head,,sizeof(head));memset(ans,,sizeof(ans));//多组数据....注意初始化
memset(vis,,sizeof(vis));memset(can,,sizeof(can));
memset(f,,sizeof(f));memset(sum,,sizeof(sum));
memset(Dis,/,sizeof(Dis));memset(Ti,/,sizeof(Ti));
memset(head2,,sizeof(head2));
size=;num=;falg=;num2=;
int ui,vi,dis,cost1,cost2;
for(int i=;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]==)//跑不到终点
{
printf("VOID\n");
continue;
}
SPFA(s);
if(falg==)printf("UNBOUND\n");//能跑到 并且有负环
if(falg==)printf("%d %d\n",Ti[t],Dis[t]);
}
return ;
}

poj 2679 Adventurous Driving(SPFA 负环)的更多相关文章

  1. spfa负环判断

    正常spfa中加入time数组,循环判断一个点是否入队并更新了n次以上注意是 > n!!其余的没有什么问题 扩展的还有,寻找所有负环上的点,这个可以在spfa中time 发现负环的时候,对那个点 ...

  2. ACM: POJ 3259 Wormholes - SPFA负环判定

     POJ 3259 Wormholes Time Limit:2000MS     Memory Limit:65536KB     64bit IO Format:%lld & %llu   ...

  3. POJ 3259 Wormholes 最短路+负环

    原题链接:http://poj.org/problem?id=3259 题意 有个很厉害的农民,它可以穿越虫洞去他的农场,当然他也可以通过道路,虫洞都是单向的,道路都是双向的,道路会花时间,虫洞会倒退 ...

  4. UVA11090 Going in Cycle!! [spfa负环]

    https://vjudge.net/problem/UVA-11090 平均权值最小的回路 为后面的做个铺垫 二分最小值,每条边权减去他,有负环说明有的回路平均权值小于他 spfa求负环的时候可以先 ...

  5. POJ 3259 Wormholes (判负环)

    Wormholes Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 46123 Accepted: 17033 Descripti ...

  6. SPFA(负环) LightOJ 1074 Extended Traffic

    题目传送门 题意:收过路费.如果最后的收费小于3或不能达到,输出'?'.否则输出到n点最小的过路费 分析:关键权值可为负,如果碰到负环是,小于3的约束条件不够,那么在得知有负环时,把这个环的点都标记下 ...

  7. (简单) LightOJ 1074 Extended Traffic,SPFA+负环。

    Description Dhaka city is getting crowded and noisy day by day. Certain roads always remain blocked ...

  8. bzoj 3597: [Scoi2014]方伯伯运椰子 [01分数规划 消圈定理 spfa负环]

    3597: [Scoi2014]方伯伯运椰子 题意: from mhy12345 给你一个满流网络,对于每一条边,压缩容量1 需要费用ai,扩展容量1 需要bi, 当前容量上限ci,每单位通过该边花费 ...

  9. LightOJ - 1074 Extended Traffic (SPFA+负环)

    题意:N个点,分别有属于自己的N个busyness(简称b),两点间若有边,则边权为(ub-vb)^3.Q个查询,问从点1到该点的距离为多少. 分析:既然是差的三次方,那么可能有负边权的存在,自然有可 ...

随机推荐

  1. 已安装好的tengine编译添加未被安装的模块

    nginx -V 可以查看原来编译时都带了哪些参数 原来的参数: --prefix=/usr/local/tengine 需添加的参数: --with-http_stub_status_module ...

  2. C# 日期格式精确到毫秒 【转】

    有时候我们要对时间进行转换,达到不同的显示效果 默认格式为:2009-6-24 14:33:34 如果要换成成200906,06-2009,2009-6-24或更多的该怎么办呢 我们要用到:DateT ...

  3. Node.js RESTful API

    什么是REST架构? REST表示代表性状态传输.REST是一种基于Web标准的架构,并使用HTTP协议. 它都是围绕着资源,其中每一个组件是资源和一个资源是由一个共同的接口使用HTTP的标准方法获得 ...

  4. [BZOJ 1042] [HAOI2008] 硬币购物 【DP + 容斥】

    题目链接:BZOJ - 1042 题目分析 首先 Orz Hzwer ,代码题解都是看的他的 blog. 这道题首先使用DP预处理,先求出,在不考虑每种硬币个数的限制的情况下,每个钱数有多少种拼凑方案 ...

  5. iOS Developer Libray (中文版)-- About Objective-C

    该篇是我自己学习iOS开发时阅读文档时随手记下的翻译,有些地方不是很准确,但是意思还是对的,毕竟我英语也不是很好,很多句子无法做到准确的字词翻译,大家可以当做参考,有错误欢迎指出,以后我会尽力翻译的更 ...

  6. .net 开发框架

    .NET开发人员值得关注的七个开源项目 2010年07月02日09:33 it168网站原创 作者:黄永兵 编译 编辑:胡铭娅 我要评论(0) [IT168技术分析]微软近几年在.NET社区开源项目方 ...

  7. java学习之运算符

    学习完了变量+常量,现在只能简单的声明变量+赋值+打印变量. 但是程序要做的就是去处理数据,把原本散乱的数据,处理成有意义的数据,供我们来使用,这就涉及到了运算符的应用. 算数运算符常用的种类: 加法 ...

  8. 【转】java中float与byte[]的互转 -- 不错

    原文网址:http://tjmljw.iteye.com/blog/1767716 起因:想把一个float[]转换成内存数据,查了一下,下面两个方法可以将float转成byte[]. 方法一 imp ...

  9. 总结linux无线命令wpa

    关于wpa_supplicant: 用到wpa_cli命令 wpa_cli -iwlan0 add_network             // wlan0 是无线网络设备的名字,增加一个网络,会返回 ...

  10. IOI 2009:Mecho

    IOI2009 Mecho Time Limit: 10000ms Memory Limit: 262144KB This problem will be judged on SPOJ. Origin ...