赚钱啦

时间限制:1000 ms  |  内存限制:65535 KB
难度:5
描述

某国家里有N个城市,分别编号为0~N-1,一个精明的商人准备从0号城市旅行到N-1号城市,在旅行的过程中,从一个城市移动到另外一个城市需要有一定的花费,并且从A城市移动到B城市的花费和B城市移动到A城市的花费相同,但是,从A城市移动到B城市能赚取的钱和从B城市移动到A城市赚的钱不一定相同。

现在,已知各个城市之间移动的花费和城市之间交易可赚取的金钱,求该商人在从0号城市移动到N-1号城市的过程中最多能赚取多少钱?

输入
第一行是一个整数T(T<=10)表示测试数据的组数

每组测试数据的第一行是两个整数N,M表示,共有N个城市(1<N<=1000),M条路(1<=M<=1000)

随后的M行,每行有5个正整数,前两个数a,b(0<=a,b<N)表示两个城市的编号。后面的三个数c,u,v分别表示在a,b城市之间移动的花费,a城市移动到b城市可赚取的资金,b城市移动到a城市可赚取的资金。

(0<=c,u,v<=1000)
输出
如果商人能够在旅行过程中赚取无限多的资金,则输出$$$

否则输出他在移动过程中最多能赚取的资金数量

如果只会赔钱的话就输出一个负数,表示最少赔的钱数。
样例输入
2
2 1
0 1 10 11 11
3 3
0 1 10 16 0
1 2 10 15 5
0 2 20 32 0
样例输出
$$$
12
来源
2011年ACM队队长选拨赛

与最短路不同的是这道题在题意上有很大的变更,求的是能获取最大资金,但方法可以用Spfa,或者bellman算法,只不过在存双向图的时候要特别注意,这里介绍一下bellman算法,代码还是挺简洁的;可以用邻接矩阵储存权值,就是在利用bellman算法的时候再反向判断一下另一个顶点就可以了,具体看代码:有不足之处望多多指教,谢谢:

#include<cstdio>
#include<cmath>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
const int INF=-0x3f3f3f3f;//注意;
const int N=1000+10;
struct node
{
int u,v,c,a,b;
} a[N];
int d[N];
int spfa(int n,int m)
{
for(int i=0; i<n; i++)
d[i]=i==0?0:INF;
for(int i=0; i<n; i++)
for(int j=0; j<m; j++)
{
if(d[a[j].v]<d[a[j].u]+a[j].a)//判断终点(两点中被指向的那个)
{
d[a[j].v]=d[a[j].u]+a[j].a;
if(i>=n-1)//存在正环图;
return 1;
}
if(d[a[j].u]<d[a[j].v]+a[j].b)//判断起点;
{
d[a[j].u]=d[a[j].v]+a[j].b;
if(i>=n-1)
return 1;
}
}
return 0;
}
int main()
{
int t,n,m,i;
scanf("%d",&t);
while(t--)
{
scanf("%d%d",&n,&m);
int f=0;
for(i=0; i<m; i++)
{
scanf("%d%d%d%d%d",&a[i].u,&a[i].v,&a[i].c,&a[i].a,&a[i].b);
a[i].a-=a[i].c,a[i].b-=a[i].c;
if(a[i].a+a[i].b>0)
f=1;
}
if(f)
printf("$$$\n");
else
{
int k=spfa(n,m);
if(k)
printf("$$$\n");
else
printf("%d\n",d[n-1]);
}
}
return 0;
}

自我感觉代码比较简短,易懂,有的地方还可以改进优化;

NYOJ-183赚钱啦,bellman//spfa水过,,题还是蛮变态的赶脚~~的更多相关文章

  1. PKU 1932 XYZZY(Floyd+Bellman||Spfa+Floyd)

    题目大意:原题链接 给你一张图,初始你在房间1,初始生命值为100,进入每个房间会加上那个房间的生命(可能为负),问是否能到达房间n.(要求进入每个房间后生命值都大于0) 解题思路: 解法一:Floy ...

  2. HDU——2066一个人的旅行(优先队列SPFA水题)

    一个人的旅行 Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Sub ...

  3. 8.2/baltic神(水)题

    summary:10 bzoj1334: Description N个政党要组成一个联合内阁,每个党都有自己的席位数. 现在希望你找出一种方案,你选中的党的席位数要大于总数的一半,并且联合内阁的席位数 ...

  4. 【Richard 的刷(水)题记录】

    大概想了想,还是有个记录比较好. 9/24 网络流一日游: 最大流:bzoj1711[Usaco2007 Open]Dining 拆点 BZOJ 3993 Sdoi2015 星际战争 二分 P.S.这 ...

  5. POJ1511 Invitation Cards SPFA算法裸题变形

    原题目:http://poj.org/problem?id=1511 给出一个有向图,求出这个图从1到所有点的最短路径和所有点到1的最短路径的和. 这题数据量有点大,数据范围也大,所以用SPFA+邻接 ...

  6. mysql练习题目试水50题,附建库sql代码

    如果你没试过水的话,那一题一题地每一题都敲一遍吧.不管它们对你看来有多么简单.  建库代码 部分题目答案在末尾,可用ctrl f  搜索题号. 作业练习——学生-选课 表结构 学生表: Student ...

  7. 我的CodeF水A题之路

    Codeforces Round #359 (Div. 2) A. Free Ice Cream 题目链接:http://www.codeforces.com/problemset/problem/6 ...

  8. codevs 1360 xth砍树 线段树不能再水的题了

    连标记都不用打.. #include<cstdio> #include<cstring> #include<algorithm> using namespace s ...

  9. 【CodeForces 602B】G - 一般水的题2-Approximating a Constant Range

    Description When Xellos was doing a practice course in university, he once had to measure the intens ...

随机推荐

  1. nodejs on raspi

    一. https://cnodejs.org/topic/54032efa9769c2e93797cd06 其中的 “安装Node.js” 一节 注意事项: 1. 它用的是v0.10.26(很早的版本 ...

  2. android开发学习 ------- json数据与实体类之间的相互转换

    在网络请求的时候,会返回给我们实体类,我们需要将实体类转化为json字符串,方便处理数据: 有时候也会将json数据转换为实体类. 在Android Studio中,json要互相转换,需要用到gso ...

  3. sql子查询的例子

    1.单行子查询        select ename,deptno,sal        from emp        where deptno=(select deptno from dept ...

  4. 架包Error inflating class错误

    当引用架包后,出现Error inflating class错误时通常要检测架包是否正确引用: 1.首先将你所需要的架包拷贝到工程目录下: 2.右击工程,选择Build Path-->confi ...

  5. Redis学习笔记(五)散列进阶

    HEXISTS key_name key(检查键key是否存在) HKEYS key_name(获得散列的所有键) HVALS key_name(获得散列的所有值) HINCRBY key_name ...

  6. ubuntu上部署windows开发的dotnet core程序

    目标:完成windows上开发的dotnet core程序部署至linux服务器上(Ubuntu 14.04) windows上开发dotnet core很简单,安装好VS2017,建立相关类型的项目 ...

  7. Android(java)学习笔记179:多媒体之加载大图片到内存(Bitmap API)

    1. Bitmap (API使用) android里面的bitmap中,一个像素点需要4个byte去表示,这是因为android表示颜色是" argb ":其中 a 表示是透明度, ...

  8. gym 100947I (求因子)

    What a Mess Alex is a very clever boy, after all he is the son of the greatest watchmaker in Odin. O ...

  9. C/C++语言:科学计数法

    主要用来表示浮点数,表达方便 浮点数的科学计数,由三个部分组成: a + E + b a:由一个浮点数组成,如果写成整数,编译器会自动转化为浮点数: E:可以大写E,也可以小写e: b:使用一个十进制 ...

  10. 【原创翻译】链接DLL至可执行文件---翻译自MSDN

    可执行文件.exe链接(或加载)DLL有以下两种形式: 隐式链接 显式链接 隐式链接是指静态加载或在程序加载时动态链接. 通过隐式链接,在使用DLL时,可执行文件链接到一个由生成DLL的人提供的导入函 ...