题目传送门

 1 /*
 2     题意:程序从1到n版本升级,正版+正版->正版,正版+盗版->盗版,盗版+盗版->盗版
 3             正版+破解版->正版,盗版+破解版->盗版
 4     DP:每种情况考虑一遍,递推就行了
 5     注意:开long long
 6 */
 7 #include <cstdio>
 8 #include <iostream>
 9 #include <algorithm>
10 #include <cstring>
11 #include <cmath>
12 using namespace std;
13
14 const int MAXN = 1e4 + 10;
15 const int INF = 0x3f3f3f3f;
16 struct Node
17 {
18     int u, v, w;
19     char s[10];
20 }node[MAXN];
21 long long dp[MAXN][2];
22
23 bool cmp(Node x, Node y)
24 {
25     if (x.u == y.u)    return     x.v < y.v;
26     return x.u < y.u;
27 }
28
29 int main(void)        //URAL 1741 Communication Fiend
30 {
31     //freopen ("T.in", "r", stdin);
32
33     int n, m;
34     while (scanf ("%d%d", &n, &m) == 2)
35     {
36         for (int i=1; i<=m; ++i)
37         {
38             scanf ("%d %d %d %s", &node[i].u, &node[i].v, &node[i].w, &node[i].s);
39         }
40         sort (node+1, node+1+m, cmp);
41
42         memset (dp, -1, sizeof (dp));
43         dp[1][0] = 0;
44         for (int i=1; i<=m; ++i)
45         {
46             Node a = node[i];
47             if (a.s[0] == 'L')
48             {
49                 if (dp[a.u][0] != -1 && (dp[a.v][0] == -1 || dp[a.v][0] > dp[a.u][0] + a.w))
50                 {
51                     dp[a.v][0] = dp[a.u][0] + a.w;
52                 }
53             }
54             else if (a.s[0] == 'P')
55             {
56                 if (dp[a.u][0] != -1 && (dp[a.v][1] == -1 || dp[a.v][1] > dp[a.u][0] + a.w))
57                 {
58                     dp[a.v][1] = dp[a.u][0] + a.w;
59                 }
60                 if (dp[a.u][1] != -1 && (dp[a.v][1] == -1 || dp[a.v][1] > dp[a.u][1] + a.w))
61                 {
62                     dp[a.v][1] = dp[a.u][1] + a.w;
63                 }
64             }
65             else if (a.s[0] == 'C')
66             {
67                 if (dp[a.u][0] != -1 && (dp[a.v][0] == -1 || dp[a.v][0] > dp[a.u][0] + a.w))
68                 {
69                     dp[a.v][0] = dp[a.u][0] + a.w;
70                 }
71                 if (dp[a.u][1] != -1 && (dp[a.v][1] == -1 || dp[a.v][1] > dp[a.u][1] + a.w))
72                 {
73                     dp[a.v][1] = dp[a.u][1] + a.w;
74                 }
75             }
76         }
77
78         if (dp[n][0] == -1 && dp[n][1] == -1)    puts ("Offline");
79         else
80         {
81             puts ("Online");
82             if (dp[n][0] == -1)    printf ("%I64d\n", dp[n][1]);
83             else if (dp[n][1] == -1)    printf ("%I64d\n", dp[n][0]);
84             else    printf ("%I64d\n", min (dp[n][0], dp[n][1]));
85         }
86     }
87
88     return 0;
89 }
90
91 /*
92 Online
93 Offline
94 */

  1 /*
  2     WA了4,5发,第一是抄Kuangbin的模板抄错了;第二是选取的INF值太小了
  3     以后学习一下最值的选取的方法:)
  4 */
  5 #include <cstdio>
  6 #include <iostream>
  7 #include <algorithm>
  8 #include <cstring>
  9 #include <vector>
 10 #include <cmath>
 11 #include <queue>
 12 using namespace std;
 13
 14 const int MAXN = 1e4 + 10;
 15 const int INF = 0x3f3f3f3f;
 16 const int INFF = 0x7fffffff;
 17 const long long inf = ((long long)1<<50);
 18 struct Edge
 19 {
 20     int v, w;
 21     int f;
 22     Edge (int _v = 0, int _w = 0, int _f = 0) : v (_v), w (_w), f (_f) {}
 23 };
 24 bool vis[MAXN];
 25 int cnt[MAXN];
 26 long long d[MAXN][2];
 27 vector<Edge> G[MAXN];
 28 int n, m;
 29
 30 void add_edge(int u, int v, int w, int f)
 31 {
 32     G[u].push_back (Edge (v, w, f));
 33 }
 34
 35 bool SPFA(int s)
 36 {
 37     memset (cnt, 0, sizeof (cnt));
 38     memset (vis, false, sizeof (vis));
 39     for (int i=1; i<=n; ++i)    d[i][0] = d[i][1] = inf;
 40     vis[s] = true;    d[s][0] = 0;    cnt[s] = 1;
 41
 42     queue<int> Q;    Q.push (s);
 43     while (!Q.empty ())
 44     {
 45         int u = Q.front ();    Q.pop ();
 46         vis[u] = false;                        //失误!
 47         for (int i=0; i<G[u].size (); ++i)
 48         {
 49             int v = G[u][i].v;    int w = G[u][i].w;    int f = G[u][i].f;
 50             if (f == 0)
 51             {
 52                 if (d[v][0] > d[u][0] + w)    d[v][0] = d[u][0] + w;
 53             }
 54             else if (f == 1)
 55             {
 56                 if (d[v][1] > d[u][0] + w)    d[v][1] = d[u][0] + w;
 57                 if (d[v][1] > d[u][1] + w)    d[v][1] = d[u][1] + w;
 58             }
 59             else
 60             {
 61                 if (d[v][0] > d[u][0] + w)    d[v][0] = d[u][0] + w;
 62                 if (d[v][1] > d[u][1] + w)    d[v][1] = d[u][1] + w;
 63             }
 64             if (!vis[v])
 65             {
 66                 vis[v] = true;    Q.push (v);
 67                 if (++cnt[v] > n)    return true;
 68             }
 69         }
 70     }
 71
 72     return false;
 73 }
 74
 75 int main(void)        //URAL 1741 Communication Fiend
 76 {
 77     //freopen ("T.in", "r", stdin);
 78
 79     while (scanf ("%d%d", &n, &m) == 2)
 80     {
 81         for (int i=1; i<=n; ++i)    G[i].clear ();
 82         for (int i=1; i<=m; ++i)
 83         {
 84             int u, v, w, f;    char s[10];
 85             scanf ("%d %d %d %s", &u, &v, &w, &s);
 86             if (s[0] == 'L')    f = 0;
 87             else if (s[0] == 'P')    f = 1;
 88             else if (s[0] == 'C')    f = -1;
 89             add_edge (u, v, w, f);
 90         }
 91
 92         if (!SPFA (1))
 93         {
 94             long long ans = min (d[n][0], d[n][1]);
 95             if (ans == inf)    puts ("Offline");
 96             else    {puts ("Online");    printf ("%I64d\n", ans);}
 97         }
 98     }
 99
100     return 0;
101 }
102
103 /*
104 Online
105 Offline
106 */

SPFA

转载于:https://www.cnblogs.com/Running-Time/p/4495633.html

DP/最短路 URAL 1741 Communication Fiend相关推荐

  1. luogu P4745 [CERC2017]Gambling Guide(期望DP + 最短路实现)

    整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 P4745 [CERC2017]Gambling Guide(期望DP + 最短路实现) Weblin ...

  2. E:By Elevator or Stairs? CF595 DP最短路

    题目链接 比赛的时候一看,这不是最短路吗,然后敲了一个最短路. 然后比赛完发现大家基本都写的dp,我真是个憨憨,dp3行 最短路就建个简单的图,dp就是从上一维转化过来就是了 优秀的dp: //#pr ...

  3. 1003. [ZJOI2006]物流运输【区间DP+最短路】

    Description 物流公司要把一批货物从码头A运到码头B.由于货物量比较大,需要n天才能运完.货物运输过程中一般要转 停好几个码头.物流公司通常会设计一条固定的运输路线,以便对整个运输过程实施严 ...

  4. 洛谷2149 Elaxia的路线(dp+最短路)

    QwQ好久没更新博客了,颓废了好久啊,来补一点东西 题目大意 给定两个点对,求两对点间最短路的最长公共路径. 其中\(n,m\le 10^5\) 比较简单吧 就是跑四遍最短路,然后把最短路上的边拿出来 ...

  5. 最短路计数(dp+最短路)

    Description 给出一个 n 个顶点 m 条边的无向无权图,顶点编号为 1 到 n. 问从顶点 1 开始,到其他每个点的最短路有几条. Input 第一行 2 个正整数 n, m  ( 1 ≤ ...

  6. [bzoj3875][DP][最短路]骑士游戏

    Description [故事背景] 长期的宅男生活中,JYY又挖掘出了一款RPG游戏.在这个游戏中JYY会 扮演一个英勇的骑士,用他手中的长剑去杀死入侵村庄的怪兽. [问题描述] 在这个游戏中,JY ...

  7. 【BZOJ】1003: [ZJOI2006]物流运输trans(SPFA+DP)

    http://www.lydsy.com/JudgeOnline/problem.php?id=1003 这题一开始看是不会的额,,,还是看题解了..一开始我觉得不能用最短路啥的,,看了题解发现这是d ...

  8. NOIP 好题推荐(DP+搜索+图论)POJ ZOJ

    NOIP好题推荐(DP+搜索+图论)POJ ZOJ 1370 Gossiping (数论->模线性方程有无解的判断)+(图论->DFS)  1090 Chain ->格雷码和二进制码 ...

  9. [kuangbin]各种各样的题单

    [kuangbin]各种各样的题单 专题1 简单搜索 POJ 1321 POJ 2251 POJ 3278 POJ 3279 POJ 1426 POJ 3126 POJ 3087 POJ 3414 F ...

  10. 【学习笔记】《概率与期望全家桶》(ACM / OI)概率与期望 / 概率论知识小结

    整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 这块知识很少,但是题很难- 目录 0x00 概率 0x01 基本概念 0x02 古典概率 0x03 条 ...

最新文章

  1. 证书过期--app审核提示90034证书错误
  2. access和SQL的区别
  3. hdu--1075--字典树||map
  4. lamda获取参数集合去空_JAVA集合框架知识
  5. [js] 使用delete删除数组,其长度会改变吗
  6. 定时任务 Scheduled quartz
  7. 编程入门先学什么python-编程零基础应当如何开始学习 Python?
  8. 云上的消费你真的算清楚了?
  9. DIY实用工具——看看大神手下的示波器
  10. c语言程序设计超市会员卡管理系统,C语言程序设计课程设计报告超市水果信息管理系统...
  11. 物联网项目开发实战案例
  12. win10睡眠只是关掉显示器的问题
  13. 钉钉OA流程审批,Jenkins自动授权通知用户密码
  14. 7-3 水仙花数(20 分) (20 分)(PTA Python版本)
  15. Android程序员接下来的路该如何走?
  16. 2019年最新Java和Java工程师发展现状解析,了解一下?
  17. 什么是外键,外键的作用
  18. JQuery中的动画效果
  19. deepinv2 添加打印机_如何在Deepin 20下安装brother打印机驱动及设置网络打印机?...
  20. 虚拟机linux系统硬盘扩容设置

热门文章

  1. [流行偶像]分析王菲唱腔的精辟文字(转载)
  2. 陈式太极拳式名考释、动作、着法要领说明
  3. 使用aiop实现事件等待模式
  4. XML 中大于等于小于等于的写法
  5. poj 1284 Primitive Roots 求素数元根数
  6. 使用智遥工作流,优化SAP请购流程
  7. 程序员如何更好的提升自己
  8. vue按住shift键多选(以element框架的table为例)
  9. postgresql 优势
  10. 我的世界服务器反作弊不起作用,[优化][反作弊]NeverLag——优化性能、防作弊、修复MC漏洞、限制刷物品[1.6.4-1.8.7]...