ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

【SPFA】【P2648】 赚钱

2019-07-09 13:06:53  阅读:233  来源: 互联网

标签:zzy 样例 城市 310 单向 P2648 SPFA 个用 赚钱


题目背景
改编自某题

题目描述
zzy现在决定环游中国,顺便赚点钱。zzy在一个城市最多只能赚D元,然后他可以选择退休也就是停止赚钱,或者去其它城市工作。当然,他可以在别处工作一阵子后又回到原来的城市再赚D元。这样的往返次数是没有任何限制的。

城市间有P条单向路径连接,共有C座城市,编号从1到C。路径i从城市Ai到城市Bi,在路径行走上不用任何花费。

zzy还可以乘飞机从某个城市飞到另一个城市。共有F条单向的航线,第i条航线是从城市Ji飞到另一座城市Ki,费用是Ti元。假如zzy身上没有现钱,他可以用以后赚的钱来付机票钱。

zzy可以从任何一个城市出发开始赚钱,并且选择在任何时候、任何城市退休。现在zzy想要知道,如果在工作时间上不做限制,那么zzy共可以赚多少钱呢?如果赚的钱也不会出现限制,那么就输出orz。

输入输出格式
输入格式:
第一行,4个用空格分开的正整数,D,P,C,F。

第二行到P+1行,第i+1行包含2个用空格分开的整数,表示一条从城市Ai到城市Bi的单向路径。

接下来的F行,每行3个用空格分开的正整数,表示一条从城市Ji到城市Ki的单向航线,费用为Ti。

输出格式:
如果zzy赚的钱没有限制,输出orz。如果有限制,那么就输出在给定的规则下zzy最多可以赚到的钱数。

输入输出样例
输入样例#1:
100 3 5 2
1 5
2 3
1 4
5 2 150
2 5 120
输出样例#1:
250
说明
对于100%的数据,1<=D<=1000,1<=P<=200,2<=C<=300,1<=F<=400。

代码:

#include <bits/stdc++.h>
using namespace std;

int D, P, C, F;
int g[310][310], d[310], v[310], cnt[310];

void Floyed()
{
    for (int k = 1; k <= C; k++)
        for (int i = 1; i <= C; i++)
            for (int j = 1; j <= C; j++)
                g[i][j] = max(g[i][j], g[i][k] + g[k][j]);
}

int Find()
{
    int ans = 0xc0c0c0c0;
    for (int i = 1; i <= C; i++)
        for (int j = 1; j <= C; j++)
            ans = max(ans, g[i][j]);
    return ans;
}

int main()
{
    scanf("%d%d%d%d", &D, &P, &C, &F);
    memset(g, 0xc0, sizeof(g));
    for (int x, y, i = 1; i <= P; i++)
    {
        scanf("%d%d", &x, &y);
        g[x][y] = D;
    }
    for (int x, y, z, i = 1; i <= F; i++)
    {
        scanf("%d%d%d", &x, &y, &z);
        g[x][y] = D - z;
    }
    Floyed();
    int ans = Find();
    Floyed();
    int ans2 = Find();
    if (ans != ans2)
        puts("orz");
    else
        printf("%d\n", ans + D);
    return 0;
}
/*
简化版题目大意:
给定一个有向图,点有点权(每个点点权都一样),有的边有负边权,有的边有0边权
判断是否存在正环,如果没有就输出图中最长路
--------------------------------------
由于一条路径的点数等于边数+1
把边权加等点权,最后答案加等于一个d
先跑一遍Floyed找最长路
再来一遍,如果两次最长路值不一样那么就有正环。
*/

标签:zzy,样例,城市,310,单向,P2648,SPFA,个用,赚钱
来源: https://blog.csdn.net/sericon/article/details/95182421

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有