题目传送门

  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. const int MAXN = 1e4 + ;
  14. const int INF = 0x3f3f3f3f;
  15. struct Node
  16. {
  17. int u, v, w;
  18. char s[];
  19. }node[MAXN];
  20. long long dp[MAXN][];
  21. bool cmp(Node x, Node y)
  22. {
  23. if (x.u == y.u) return x.v < y.v;
  24. return x.u < y.u;
  25. }
  26. int main(void) //URAL 1741 Communication Fiend
  27. {
  28. //freopen ("T.in", "r", stdin);
  29. int n, m;
  30. while (scanf ("%d%d", &n, &m) == )
  31. {
  32. for (int i=; i<=m; ++i)
  33. {
  34. scanf ("%d %d %d %s", &node[i].u, &node[i].v, &node[i].w, &node[i].s);
  35. }
  36. sort (node+, node++m, cmp);
  37. memset (dp, -, sizeof (dp));
  38. dp[][] = ;
  39. for (int i=; i<=m; ++i)
  40. {
  41. Node a = node[i];
  42. if (a.s[] == 'L')
  43. {
  44. if (dp[a.u][] != - && (dp[a.v][] == - || dp[a.v][] > dp[a.u][] + a.w))
  45. {
  46. dp[a.v][] = dp[a.u][] + a.w;
  47. }
  48. }
  49. else if (a.s[] == 'P')
  50. {
  51. if (dp[a.u][] != - && (dp[a.v][] == - || dp[a.v][] > dp[a.u][] + a.w))
  52. {
  53. dp[a.v][] = dp[a.u][] + a.w;
  54. }
  55. if (dp[a.u][] != - && (dp[a.v][] == - || dp[a.v][] > dp[a.u][] + a.w))
  56. {
  57. dp[a.v][] = dp[a.u][] + a.w;
  58. }
  59. }
  60. else if (a.s[] == 'C')
  61. {
  62. if (dp[a.u][] != - && (dp[a.v][] == - || dp[a.v][] > dp[a.u][] + a.w))
  63. {
  64. dp[a.v][] = dp[a.u][] + a.w;
  65. }
  66. if (dp[a.u][] != - && (dp[a.v][] == - || dp[a.v][] > dp[a.u][] + a.w))
  67. {
  68. dp[a.v][] = dp[a.u][] + a.w;
  69. }
  70. }
  71. }
  72. if (dp[n][] == - && dp[n][] == -) puts ("Offline");
  73. else
  74. {
  75. puts ("Online");
  76. if (dp[n][] == -) printf ("%I64d\n", dp[n][]);
  77. else if (dp[n][] == -) printf ("%I64d\n", dp[n][]);
  78. else printf ("%I64d\n", min (dp[n][], dp[n][]));
  79. }
  80. }
  81. return ;
  82. }
  83. /*
  84. Online
  85. Offline
  86. */

  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. const int MAXN = 1e4 + ;
  14. const int INF = 0x3f3f3f3f;
  15. const int INFF = 0x7fffffff;
  16. const long long inf = ((long long)<<);
  17. struct Edge
  18. {
  19. int v, w;
  20. int f;
  21. Edge (int _v = , int _w = , int _f = ) : v (_v), w (_w), f (_f) {}
  22. };
  23. bool vis[MAXN];
  24. int cnt[MAXN];
  25. long long d[MAXN][];
  26. vector<Edge> G[MAXN];
  27. int n, m;
  28. void add_edge(int u, int v, int w, int f)
  29. {
  30. G[u].push_back (Edge (v, w, f));
  31. }
  32. bool SPFA(int s)
  33. {
  34. memset (cnt, , sizeof (cnt));
  35. memset (vis, false, sizeof (vis));
  36. for (int i=; i<=n; ++i) d[i][] = d[i][] = inf;
  37. vis[s] = true; d[s][] = ; cnt[s] = ;
  38. queue<int> Q; Q.push (s);
  39. while (!Q.empty ())
  40. {
  41. int u = Q.front (); Q.pop ();
  42. vis[u] = false; //失误!
  43. for (int i=; i<G[u].size (); ++i)
  44. {
  45. int v = G[u][i].v; int w = G[u][i].w; int f = G[u][i].f;
  46. if (f == )
  47. {
  48. if (d[v][] > d[u][] + w) d[v][] = d[u][] + w;
  49. }
  50. else if (f == )
  51. {
  52. if (d[v][] > d[u][] + w) d[v][] = d[u][] + w;
  53. if (d[v][] > d[u][] + w) d[v][] = d[u][] + w;
  54. }
  55. else
  56. {
  57. if (d[v][] > d[u][] + w) d[v][] = d[u][] + w;
  58. if (d[v][] > d[u][] + w) d[v][] = d[u][] + w;
  59. }
  60. if (!vis[v])
  61. {
  62. vis[v] = true; Q.push (v);
  63. if (++cnt[v] > n) return true;
  64. }
  65. }
  66. }
  67. return false;
  68. }
  69. int main(void) //URAL 1741 Communication Fiend
  70. {
  71. //freopen ("T.in", "r", stdin);
  72. while (scanf ("%d%d", &n, &m) == )
  73. {
  74. for (int i=; i<=n; ++i) G[i].clear ();
  75. for (int i=; i<=m; ++i)
  76. {
  77. int u, v, w, f; char s[];
  78. scanf ("%d %d %d %s", &u, &v, &w, &s);
  79. if (s[] == 'L') f = ;
  80. else if (s[] == 'P') f = ;
  81. else if (s[] == 'C') f = -;
  82. add_edge (u, v, w, f);
  83. }
  84. if (!SPFA ())
  85. {
  86. long long ans = min (d[n][], d[n][]);
  87. if (ans == inf) puts ("Offline");
  88. else {puts ("Online"); printf ("%I64d\n", ans);}
  89. }
  90. }
  91. return ;
  92. }
  93. /*
  94. Online
  95. Offline
  96. */

SPFA

DP/最短路 URAL 1741 Communication Fiend的更多相关文章

  1. Ural 1741 Communication Fiend(隐式图+虚拟节点最短路)

    1741. Communication Fiend Time limit: 1.0 second Memory limit: 64 MB Kolya has returned from a summe ...

  2. URAL 1741 Communication Fiend(最短路径)

    Description Kolya has returned from a summer camp and now he's a real communication fiend. He spends ...

  3. URAL 1741 Communication Fiend

    URAL 1741 思路: dp 状态:dp[i][1]表示到第i个版本为正版的最少流量花费 dp[i][0]表示到第i个版本为盗版的最少流量花费 初始状态:dp[1][0]=dp[0][0]=0 目 ...

  4. 1741. Communication Fiend(dp)

    刷个简单的DP缓缓心情 1A #include <iostream> #include<cstdio> #include<cstring> #include< ...

  5. 旅游(CSUST省赛选拔赛2+状压dp+最短路)

    题目链接:http://csustacm.com:4803/problem/1016 题目: 思路:状压dp+最短路,比赛的时候有想到状压dp,但是最短路部分写挫了,然后就卡死了,对不起出题人~dis ...

  6. NOIP2017逛公园(dp+最短路)

    策策同学特别喜欢逛公园.公园可以看成一张N个点M条边构成的有向图,且没有 自环和重边.其中1号点是公园的入口,N号点是公园的出口,每条边有一个非负权值, 代表策策经过这条边所要花的时间. 策策每天都会 ...

  7. BZOJ.1003.[ZJOI2006]物流运输(DP 最短路Dijkstra)

    题目链接 容易看出是个最短路+DP.既然答案和天数有关,那么就令\(f[i]\)表示前\(i\)天最小成本. 这个转移很好想: \(f[i]=\min(f[i],\ f[j]+cost(j+1,i)+ ...

  8. 2018.09.02 bzoj1003: [ZJOI2006]物流运输(dp+最短路转移)

    传送门 dp好题. 每一天要变更路线一定还是走最短路. 所以l~r天不变更路线的最优方案就是把l~r天所有不能走的点都删掉再求最短路.显然是可以dp的. 设f[i]表示第i天的最优花销.那么我们枚举在 ...

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

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

随机推荐

  1. Mac OS X【快捷键组合】汇总

    以下是可能会出现在 OS X 菜单中的修饰键符号: ⌘—— () ⌃ ——Control ⌥—— (alt) ⇧——Shift ⇪——Caps Lock fn——功能键就是fn 启动快捷键 按下按键 ...

  2. JVM<一>----------运行时数据区域

    参考:1.JVM Specification: http://docs.oracle.com/javase/specs/jvms/se7/html/jvms-2.html#jvms-2.5 2.< ...

  3. Linux大神必备-文本编辑器

    导读 我们在 Linux 上不缺乏非常现代化的编辑软件,但是它们都是基于 GUI(图形界面)的编辑软件.正如你所了解的:Linux 真正的魅力在于命令行,当你正在用命令行工作时,你就需要一个可以在控制 ...

  4. Unity模型导入的若干问题

    原地址:http://tieba.baidu.com/p/2807225555 我觉得有三点感觉在导出时比较重要的1.单位的设置3dsmax系统单位设置就设成厘米显示单位公制也设成厘米这样在max里的 ...

  5. vundle安装 给vim插上翅膀

    (这些文章都是从我的个人主页上粘贴过来的,大家也可以访问我的主页 www.iwangzheng.com) vundle安装方法如下 首先执行以下命令 $ git clone https://githu ...

  6. 重构edit 和 new页面

    www.iwangzheng.com 由于edit和new页面的相似部分很多,需要提取出来,现在就是提取的方法 从form 的开始部分选中,shift+v选中对应的行 :Rextract form 然 ...

  7. Ubuntu下为Firefox安装Adobe Flash Player

      使用环境:     OS:Ubuntu 12.04 LTS     Browser: Firefox 12.0     Adobe Flash Player: install_flash_play ...

  8. poj1789 Truck History

    Truck History Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 20768   Accepted: 8045 De ...

  9. NOIP 2011 Day 1 部分题解 (Prob#1 and Prob#2)

    Problem 1: 铺地毯 乍一看吓cry,地毯覆盖...好像是2-dims 线段树,刚开头就这么难,再一看,只要求求出一个点,果断水题,模拟即可.(注意从标号大的往小的枚举,只要有一块地毯符合要求 ...

  10. 用Python操纵MySQL

    本例用Python操纵MySQL,从指定文件读取数据,并对数据进行处理,处理之后批量插入MySQL. 贴上代码: # -*- coding: gbk -*- import re import MySQ ...