[ABC261Ex] Game on Graph
Problem Statement
We have a directed graph with \(N\) vertices and \(M\) edges. Edge \(i\) is directed from Vertex \(A_i\) to \(B_i\).and has a weight of \(C_i\).
Initially, there is a piece on Vertex \(v\). Takahashi and Aoki will play a game where they alternate turns moving the piece as follows:
- If there is no edge that goes from the vertex on which the piece is placed, end the game.
- If there are edges that go from the vertex on which the piece is placed, choose one of those edges and move the piece along that edge.
Takahashi goes first. Takahashi tries to minimize the total weight of the edges traversed by the piece, and Aoki tries to maximize it.
More formally, their objectives are as follows.
Takahashi gives the first priority to ending the game in a finite number of moves. If this is possible, he tries to minimize the total weight of the edges traversed by the piece.
Aoki gives the first priority to preventing the game from ending in a finite number of moves. If this is impossible, he tries to maximize the total weight of the edges traversed by the piece.
(If the piece traverses the same edge multiple times, the weight is added that number of times.)
Determine whether the game ends in a finite number of moves when both players play optimally. If it ends, find the total weight of the edges traversed by the piece.
Constraints
- \(1≤N≤2×10^5\)
- \(0≤M≤2×10^5\)
- \(1\le v≤N\)
- \(1≤A_i,B_i≤N\)
- There is no multi-edges. That is, \((A_i,B_i)\ne (A_j,B_j)\) for \(i\ne j\)
- There is no self-loops. That is, \(A_i\ne B_i\).
- \(0≤C≤10 ^9\)
- All values in input are integers.
Input
Input is given from Standard Input in the following format:
\(N\) \(M\) \(v\)
\(A_1\) \(B_1\) \(C_1\)
\(A_2\) \(B_2\) \(C_2\)
⋮
\(A_M\) \(B_M\) \(C_M\)
Output
If the game does not end in a finite number of moves when both players play optimally, print INFINITY.
If the game ends in a finite number of moves, print the total weight of the edges traversed by the piece.
Sample Input 1
7 6 1
1 2 1
1 3 10
2 4 100
2 5 102
3 6 20
3 7 30
Sample Output 1
40
First, Takahashi will move the piece to Vertex \(3\). Next, Aoki will move the piece to Vertex \(7\), and the game will end.
The total weight of the edges traversed by the piece will be \(10+30=40\).
Sample Input 2
3 6 3
1 2 1
2 1 2
2 3 3
3 2 4
3 1 5
1 3 6
Sample Output 2
INFINITY
The game will not end in a finite number of moves.
Sample Input 3
4 4 1
1 2 1
2 3 1
3 1 1
2 4 1
Sample Output 3
5
The piece will go \(1→2→3→1→2→4\).
假设图是一个有向无环图,那么直接使用 DAG 上 dp 即可。轮到 Alice 时在所有后继节点中取最小值。轮到 Bob 时在所有后继节点中取最大值。
那么如果是有环呢?有环的 min/max dp 的经典解法是跑最短路。把无后继的节点入堆,图建成反图,跑 dij 就行了。
但是这个 dp 有时候取最大值,有时候取最小值,好像很难处理。
首先如果轮到 Alice 的话,直接取最小值。因为 dij 的堆用小根堆,所以Alice的dp值直接跑dij是正确的。
但是如果轮到 Bob,他的值不像 Alice,需要所有的后继节点更新后,才能更新 Bob 的dp值。而且他是希望可以在博弈中跑出死循环的,所以如果不是所有的后继节点都更新得到,他就不更新。我们可以使用类似拓扑的方式处理。记录入度,然后松弛时入度减一。
那么想清楚代码就很好写了。
#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
const int N=2e5+5;
struct node{
int v,k;
LL w;
bool operator<(const node&n)const{
return w>n.w;
}
};
struct edge{
int v,nxt,w;
}e[N<<1];
int hd[N],n,m,s,u,v,w,e_num,in[N],vis[N][2];
LL dis[N][2];
priority_queue<node>q;
void add_edge(int u,int v,int w)
{
e[++e_num]=(edge){v,hd[u],w};
hd[u]=e_num;
}
void dijkstra()
{
for(int i=1;i<=n;i++)
{
if(!in[i])
{
q.push((node){i,0,0});
q.push((node){i,1,0});
}
else
dis[i][0]=0x7f7f7f7f7f7f7f7f;
}
// printf("%d\n",dis[1][0]);
while(!q.empty())
{
int v=q.top().v,k=q.top().k;
// printf("%d %d %d\n",v,k,dis[v][k]);
q.pop();
if(vis[v][k])
continue;
if(k)
{
for(int i=hd[v];i;i=e[i].nxt)
{
// if(v==2)
// printf("%d %d %d\n",e[i].v,dis[v][1]+e[i].w,dis[e[i].v][0]);
if(dis[v][1]+e[i].w<dis[e[i].v][0])
{
dis[e[i].v][0]=dis[v][1]+e[i].w;
q.push((node){e[i].v,0,dis[e[i].v][0]});
}
}
}
else
{
for(int i=hd[v];i;i=e[i].nxt)
{
in[e[i].v]--;
if(dis[v][0]+e[i].w>dis[e[i].v][1])
{
dis[e[i].v][1]=dis[v][0]+e[i].w;
// q.push((node){e[i].v,1,-dis[e[i].v][1]});
}
if(!in[e[i].v])
q.push((node){e[i].v,1,dis[e[i].v][1]});
}
}
}
}
int main()
{
scanf("%d%d%d",&n,&m,&s);
for(int i=1;i<=m;i++)
{
scanf("%d%d%d",&u,&v,&w),in[u]++;
add_edge(v,u,w);
}
dijkstra();
if(dis[s][0]>1e18)
printf("INFINITY");
else
printf("%lld",dis[s][0]);
}
[ABC261Ex] Game on Graph的更多相关文章
- [开发笔记] Graph Databases on developing
TimeWall is a graph databases github It be used to apply mathematic model and social network with gr ...
- Introduction to graph theory 图论/脑网络基础
Source: Connected Brain Figure above: Bullmore E, Sporns O. Complex brain networks: graph theoretica ...
- POJ 2125 Destroying the Graph 二分图最小点权覆盖
Destroying The Graph Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 8198 Accepted: 2 ...
- [LeetCode] Number of Connected Components in an Undirected Graph 无向图中的连通区域的个数
Given n nodes labeled from 0 to n - 1 and a list of undirected edges (each edge is a pair of nodes), ...
- [LeetCode] Graph Valid Tree 图验证树
Given n nodes labeled from 0 to n - 1 and a list of undirected edges (each edge is a pair of nodes), ...
- [LeetCode] Clone Graph 无向图的复制
Clone an undirected graph. Each node in the graph contains a label and a list of its neighbors. OJ's ...
- 讲座:Influence maximization on big social graph
Influence maximization on big social graph Fanju PPT链接: social influence booming of online social ne ...
- zabbix利用api批量添加item,并且批量配置添加graph
关于zabbix的API见,zabbixAPI 1item批量添加 我是根据我这边的具体情况来做的,本来想在模板里面添加item,但是看了看API不支持,只是支持在host里面添加,所以我先在一个ho ...
- Theano Graph Structure
Graph Structure Graph Definition theano's symbolic mathematical computation, which is composed of: A ...
- 纸上谈兵: 图 (graph)
作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明.谢谢! 图(graph)是一种比较松散的数据结构.它有一些节点(vertice),在某些节 ...
随机推荐
- 问题排查:nginx的反向代理感觉失效了一样
背景 最近,负责基础设施的同事,要对一批测试环境机器进行回收,回收就涉及到应用迁移,问题是整个过程一团乱.比如服务器A上一堆应用要调用服务器B上一堆服务,结果服务器B被回收了,然后服务器A上一堆应用报 ...
- 了解API接口技术及其应用
在当今数字化时代,API(Application Programming Interface,应用程序接口)已成为了各行各业之间数据传输和交互的关键技术.无论是电商平台.社交媒体.金融系统,还是智能设 ...
- 使用 OpenTelemetry 构建 .NET 应用可观测性(2):OpenTelemetry 项目简介
前世今生 OpenTracing OpenTracing 项目启动于 2016 年,旨在提供一套分布式追踪标准,以便开发人员可以更轻松地实现分布式追踪. OpenTracing 定义了一套 Traci ...
- Adobe全家桶PS、PR、AU等2022正版永久有效,无需破解直接安装就能用
[Adobe全家桶]已经亲测绝对好用,下载地址: 关注我的wx公众号"奋斗在IT"回复1013获取下载地址.
- sublime运行php文件
sublime 运行 php 文件 使用 sublime 打开一个php文件 然后 Tools -> Build System -> New Build System 将以上打开的文件内容 ...
- XL-Formula流式统计运算方式配置说明
1.简介 XL-Formula是一种用于描述流式统计运算方式的配置标准,它代表着一种通用型流式统计系统的实现方法,更深层次它代表着一种以通用型流式统计技术为切入点,低成本实现企业数据化运营的理念.该配 ...
- Games101现代计算机图形学入门 - 作业1~8 集合含提高项总结
Github 地址 :Games101 作业总结 Games101 官网:Games101 - 现代图形学入门 记录 Games101 Homework 系列 1 ~ 8 及相关作业提高项 环境安装 ...
- ModbusTCP 转 Profinet 主站网关在博图配置案例
ModbusTCP 转 Profinet 主站网关在博图配置案例 兴达易控ModbusTCP转Profinet网关,在 Profinet 侧做为 Profinet 主站控制器,接 Profinet 设 ...
- 聊聊JDK19特性之虚拟线程
1.前言 在读<深入理解JVM虚拟机>这本书前两章的时候整理了JDK从1.0到最新版本发展史,其中记录了JDK这么多年来演进过程中的一些趣闻及引人注目的一些特性,在调研JDK19新增特性的 ...
- The method dismissDialog(int) from the type Activity is deprecated
The method showDialog(int) from the type Activity is deprecated in android? up vote6down votefavor ...