DP/最短路 URAL 1741 Communication Fiend
/*
题意:程序从1到n版本升级,正版+正版->正版,正版+盗版->盗版,盗版+盗版->盗版
正版+破解版->正版,盗版+破解版->盗版
DP:每种情况考虑一遍,递推就行了
注意:开long long
*/
#include <cstdio>
#include <iostream>
#include <algorithm>
#include <cstring>
#include <cmath>
using namespace std; const int MAXN = 1e4 + ;
const int INF = 0x3f3f3f3f;
struct Node
{
int u, v, w;
char s[];
}node[MAXN];
long long dp[MAXN][]; bool cmp(Node x, Node y)
{
if (x.u == y.u) return x.v < y.v;
return x.u < y.u;
} int main(void) //URAL 1741 Communication Fiend
{
//freopen ("T.in", "r", stdin); int n, m;
while (scanf ("%d%d", &n, &m) == )
{
for (int i=; i<=m; ++i)
{
scanf ("%d %d %d %s", &node[i].u, &node[i].v, &node[i].w, &node[i].s);
}
sort (node+, node++m, cmp); memset (dp, -, sizeof (dp));
dp[][] = ;
for (int i=; i<=m; ++i)
{
Node a = node[i];
if (a.s[] == 'L')
{
if (dp[a.u][] != - && (dp[a.v][] == - || dp[a.v][] > dp[a.u][] + a.w))
{
dp[a.v][] = dp[a.u][] + a.w;
}
}
else if (a.s[] == 'P')
{
if (dp[a.u][] != - && (dp[a.v][] == - || dp[a.v][] > dp[a.u][] + a.w))
{
dp[a.v][] = dp[a.u][] + a.w;
}
if (dp[a.u][] != - && (dp[a.v][] == - || dp[a.v][] > dp[a.u][] + a.w))
{
dp[a.v][] = dp[a.u][] + a.w;
}
}
else if (a.s[] == 'C')
{
if (dp[a.u][] != - && (dp[a.v][] == - || dp[a.v][] > dp[a.u][] + a.w))
{
dp[a.v][] = dp[a.u][] + a.w;
}
if (dp[a.u][] != - && (dp[a.v][] == - || dp[a.v][] > dp[a.u][] + a.w))
{
dp[a.v][] = dp[a.u][] + a.w;
}
}
} if (dp[n][] == - && dp[n][] == -) puts ("Offline");
else
{
puts ("Online");
if (dp[n][] == -) printf ("%I64d\n", dp[n][]);
else if (dp[n][] == -) printf ("%I64d\n", dp[n][]);
else printf ("%I64d\n", min (dp[n][], dp[n][]));
}
} return ;
} /*
Online
Offline
*/
/*
WA了4,5发,第一是抄Kuangbin的模板抄错了;第二是选取的INF值太小了
以后学习一下最值的选取的方法:)
*/
#include <cstdio>
#include <iostream>
#include <algorithm>
#include <cstring>
#include <vector>
#include <cmath>
#include <queue>
using namespace std; const int MAXN = 1e4 + ;
const int INF = 0x3f3f3f3f;
const int INFF = 0x7fffffff;
const long long inf = ((long long)<<);
struct Edge
{
int v, w;
int f;
Edge (int _v = , int _w = , int _f = ) : v (_v), w (_w), f (_f) {}
};
bool vis[MAXN];
int cnt[MAXN];
long long d[MAXN][];
vector<Edge> G[MAXN];
int n, m; void add_edge(int u, int v, int w, int f)
{
G[u].push_back (Edge (v, w, f));
} bool SPFA(int s)
{
memset (cnt, , sizeof (cnt));
memset (vis, false, sizeof (vis));
for (int i=; i<=n; ++i) d[i][] = d[i][] = inf;
vis[s] = true; d[s][] = ; cnt[s] = ; queue<int> Q; Q.push (s);
while (!Q.empty ())
{
int u = Q.front (); Q.pop ();
vis[u] = false; //失误!
for (int i=; i<G[u].size (); ++i)
{
int v = G[u][i].v; int w = G[u][i].w; int f = G[u][i].f;
if (f == )
{
if (d[v][] > d[u][] + w) d[v][] = d[u][] + w;
}
else if (f == )
{
if (d[v][] > d[u][] + w) d[v][] = d[u][] + w;
if (d[v][] > d[u][] + w) d[v][] = d[u][] + w;
}
else
{
if (d[v][] > d[u][] + w) d[v][] = d[u][] + w;
if (d[v][] > d[u][] + w) d[v][] = d[u][] + w;
}
if (!vis[v])
{
vis[v] = true; Q.push (v);
if (++cnt[v] > n) return true;
}
}
} return false;
} int main(void) //URAL 1741 Communication Fiend
{
//freopen ("T.in", "r", stdin); while (scanf ("%d%d", &n, &m) == )
{
for (int i=; i<=n; ++i) G[i].clear ();
for (int i=; i<=m; ++i)
{
int u, v, w, f; char s[];
scanf ("%d %d %d %s", &u, &v, &w, &s);
if (s[] == 'L') f = ;
else if (s[] == 'P') f = ;
else if (s[] == 'C') f = -;
add_edge (u, v, w, f);
} if (!SPFA ())
{
long long ans = min (d[n][], d[n][]);
if (ans == inf) puts ("Offline");
else {puts ("Online"); printf ("%I64d\n", ans);}
}
} return ;
} /*
Online
Offline
*/
SPFA
DP/最短路 URAL 1741 Communication Fiend的更多相关文章
- Ural 1741 Communication Fiend(隐式图+虚拟节点最短路)
1741. Communication Fiend Time limit: 1.0 second Memory limit: 64 MB Kolya has returned from a summe ...
- URAL 1741 Communication Fiend(最短路径)
Description Kolya has returned from a summer camp and now he's a real communication fiend. He spends ...
- URAL 1741 Communication Fiend
URAL 1741 思路: dp 状态:dp[i][1]表示到第i个版本为正版的最少流量花费 dp[i][0]表示到第i个版本为盗版的最少流量花费 初始状态:dp[1][0]=dp[0][0]=0 目 ...
- 1741. Communication Fiend(dp)
刷个简单的DP缓缓心情 1A #include <iostream> #include<cstdio> #include<cstring> #include< ...
- 旅游(CSUST省赛选拔赛2+状压dp+最短路)
题目链接:http://csustacm.com:4803/problem/1016 题目: 思路:状压dp+最短路,比赛的时候有想到状压dp,但是最短路部分写挫了,然后就卡死了,对不起出题人~dis ...
- NOIP2017逛公园(dp+最短路)
策策同学特别喜欢逛公园.公园可以看成一张N个点M条边构成的有向图,且没有 自环和重边.其中1号点是公园的入口,N号点是公园的出口,每条边有一个非负权值, 代表策策经过这条边所要花的时间. 策策每天都会 ...
- BZOJ.1003.[ZJOI2006]物流运输(DP 最短路Dijkstra)
题目链接 容易看出是个最短路+DP.既然答案和天数有关,那么就令\(f[i]\)表示前\(i\)天最小成本. 这个转移很好想: \(f[i]=\min(f[i],\ f[j]+cost(j+1,i)+ ...
- 2018.09.02 bzoj1003: [ZJOI2006]物流运输(dp+最短路转移)
传送门 dp好题. 每一天要变更路线一定还是走最短路. 所以l~r天不变更路线的最优方案就是把l~r天所有不能走的点都删掉再求最短路.显然是可以dp的. 设f[i]表示第i天的最优花销.那么我们枚举在 ...
- 1003. [ZJOI2006]物流运输【区间DP+最短路】
Description 物流公司要把一批货物从码头A运到码头B.由于货物量比较大,需要n天才能运完.货物运输过程中一般要转 停好几个码头.物流公司通常会设计一条固定的运输路线,以便对整个运输过程实施严 ...
随机推荐
- 两周“学会”bootstrap搭建一个移动站点
一直想着用bootstrap搭建网站,它的自适应.元素封装完善.现成的Glyphicons字体图标,省去很多的css.js.ui的工作,可以快速搭建一个客户需要的站点.ytkah自己有一些div+cs ...
- Java中的final修饰符
1.什么时候可以选择final修饰符 如果想让一个类不被其他类继承,不允许在有子类,这时候就要考虑用到final来修饰. 2.用final修饰的类 首先大家要明白,用final修饰的类是不能被继承的, ...
- 快速诊断Linux性能
导读 当你为了解决一个性能问题登录到一台 Linux 服务器:在第一分钟你应该检查些什么? 通过运行下面十个命令,你就能在六十秒内粗略地了解系统正在运行的进程及资源使用情况.通过查看这些命令输出的错误 ...
- ssh和mvc理论基础
ssh中mvc到底指的什么 mvcsshhibernatespringstrutsioc在SSH整合的架构中,Spring充当了一个容器的作用,Spring使用IOC和AOP技术接管了Hibernat ...
- 通过IIS调试ASP.NET项目
当我们使用Visual Studio调试的时候,通常我们会选择VS自带的ASP.NET Developerment Server(也是默认选项),当第一次调试的时候(按F5或Ctrl+F5不调试直接打 ...
- 技术分享:WIFI钓鱼的入门姿势
简介 该实验先是搭建一个测试环境,然后创建一个假的无线接入点,把网络连接连接到假的接入点并且强迫用户连接假的无线点. 事先准备 1.无线网卡:无线网卡用于数据包的嗅探和注入. 2. Backtrack ...
- Python: 什么是*args和**kwargs
转自: http://blog.sina.com.cn/s/blog_65a8ab5d0101fglm.html http://blog.csdn.net/chenjinyu_tang/article ...
- AtomicInteger源码分析——基于CAS的乐观锁实现
AtomicInteger源码分析——基于CAS的乐观锁实现 1. 悲观锁与乐观锁 我们都知道,cpu是时分复用的,也就是把cpu的时间片,分配给不同的thread/process轮流执行,时间片与时 ...
- c++ const总结
[本文链接] http://www.cnblogs.com/hellogiser/p/cplusplus-const-summay.html 看到const 关键字,C++程序员首先想到的可能是con ...
- 27.二元树的深度[BinaryTreeDepth]
[题目] 输入一棵二元树的根结点,求该树的深度.从根结点到叶结点依次经过的结点(含根.叶结点)形成树的一条路径,最长路径的长度为树的深度. 例如 10 ...