Ural 1741 Communication Fiend(隐式图+虚拟节点最短路)
Posted Blackops
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Ural 1741 Communication Fiend(隐式图+虚拟节点最短路)相关的知识,希望对你有一定的参考价值。
1741. Communication Fiend
Memory limit: 64 MB
Input
Output
Samples
input | output |
---|---|
3 4 1 3 10 Licensed 1 2 2 Pirated 2 3 3 Licensed 2 3 6 Cracked |
Online 8 |
3 1 1 2 10 Licensed |
Offline |
Problem Source: XIV Open USU Championship
My submissions All submissions (5638) All accepted submissions (1273) Solutions rating (905)
题目链接:Ural 1741
题目虽说正规解法是DP,但是似乎是可以用最短路来做的,一开始想用d[i][k]表示到达i时系统状态是k然后建图进行spfa,然而最好还是WA10。
题目中间的版本变化似乎没有讲清楚,就是说用了某个升级包之后会使得当前系统的正版状态发生变化,尤其是Cracked包,用之后的状态跟用之前的状态是保持一致的,虽然题目中说它也是一个Licensed,但是不能使得盗版变成正版。
然后想了另外一种思路才A掉
可以将正版的系统节点看成1~n,盗版就是n+1~n+n,然后显然有:对于Lisenced版本只能从正版升级到正版,只能添加一条u->v的单向边;对于Pirate版本可以从正版升级到盗版也可以从盗版继续升级到盗版,因此添加u->v+n,与u+n->v+n;对于Cracked版本就是看成一种桥,盗版可以继续盗版,正版继续正版,
即u->v与u+n->v+n,然后跑一个spfa,看d[n]正版和d[n<<1]盗版的值就行了
提供一组数据用来说明Cracked的作用
4 3
1 2 1 P
2 3 3 C
3 4 6 L
答案应为 Offline
代码:
#include<stdio.h> #include<bits/stdc++.h> using namespace std; #define INF 0x3f3f3f3f #define CLR(x,y) memset(x,y,sizeof(x)) #define LC(x) (x<<1) #define RC(x) ((x<<1)+1) #define MID(x,y) ((x+y)>>1) typedef pair<long long,int> pli; typedef long long LL; const double PI=acos(-1.0); const int N=2e4+10; struct edge { int to; int pre; LL w; }; edge E[N]; int head[N],tot; LL d[N]; void add(int s,int t,LL w) { E[tot].to=t; E[tot].w=w; E[tot].pre=head[s]; head[s]=tot++; } void init() { CLR(d,INF); CLR(head,-1); tot=0; } void spfa(int s) { priority_queue<pli>Q; d[s]=0LL; Q.push(pli(-d[s],s)); while (!Q.empty()) { int now=Q.top().second; Q.pop(); for (int i=head[now]; ~i; i=E[i].pre) { int v=E[i].to; LL w=E[i].w; if(d[v]>d[now]+w) { d[v]=d[now]+w; Q.push(pli(-d[v],v)); } } } } int main(void) { int n,m,i,u,v; LL D; char flag[15]; while (cin>>n>>m) { init(); LL inf=d[0]; for (i=0; i<m; ++i) { cin>>u>>v>>D>>flag; if(flag[0]==‘C‘) { add(u,v,D); add(n+u,n+v,D); } else if(flag[0]==‘L‘) { add(u,v,D); } else if(flag[0]==‘P‘) { add(u,n+v,D); add(n+u,n+v,D); } } spfa(1); LL ans=min<LL>(d[n],d[n<<1]); if(ans==inf) cout<<"Offline"<<endl; else cout<<"Online"<<endl<<ans<<endl; } return 0; }
以上是关于Ural 1741 Communication Fiend(隐式图+虚拟节点最短路)的主要内容,如果未能解决你的问题,请参考以下文章
F - Tmutarakan Exams URAL - 1091 -莫比乌斯函数-容斥 or DP计数
Ural 2040 Palindromes and Super Abilities 2
ural 1057 Amount of degrees 数位dp