Invade the Mars
题目
网上大把
分析
显然不能简单直接最短路
城市被攻占的特点是:保护的城市都被攻占了
那么这个城市被攻占的最早时间必然是所有保护他的城市中最大的被攻占时间
于是我们可以
设 \(dis\) 表示军队走到城市 \(i\) 驻扎于城外的最短时间
\(f\) 表示所有保护他的城市中最大的被攻占时间
最短路中,对于当前点 \(u\)
先让他保护的点 \(v\) 度数--,并取 \(f_v = \max{dis_u}\)
若度数降至 \(0\),可松弛并将其入队
然后再考虑有向边的松弛
具体可见代码
\(Code\)
#include<cstdio>
#include<cstring>
#include<vector>
#include<queue>
using namespace std;
const int N = 3005 , M = 70005 , INF = 2e9;
int T , n , m , tot , h[N] , dis[N] , vis[N] , deg[N] , f[N];
vector<int> pt[N];
struct edge{int nxt , to , w;}e[2 * M];
struct node{
int id , d;
bool operator < (node c) const {return d > c.d;}
};
priority_queue<node> Q;
inline void add(int x , int y , int z)
{
e[++tot] = edge{h[x] , y , z} , h[x] = tot;
}
void dijkstra()
{
memset(vis , 0 , sizeof vis);
while (!Q.empty()) Q.pop();
for(register int i = 1; i <= n; i++) dis[i] = INF , f[i] = 0;
Q.push(node{1 , dis[1] = 0});
node now;
while (!Q.empty())
{
now = Q.top() , Q.pop();
int id = now.id , v;
if (vis[id]) continue;
vis[id] = 1;
for(register int i = 0; i < pt[id].size(); i++)
{
v = pt[id][i];
f[v] = max(f[v] , dis[id]);
--deg[v];
if (deg[v] == 0 && dis[v] != INF)
dis[v] = max(dis[v] , f[v]) , Q.push(node{v , dis[v]});
}
for(register int i = h[id]; i; i = e[i].nxt)
{
v = e[i].to;
if (dis[id] + e[i].w < dis[v])
{
dis[v] = max(dis[id] + e[i].w , f[v]);
if (deg[v] == 0) Q.push(node{v , dis[v]});
}
}
}
printf("%d\n" , dis[n]);
}
int main()
{
scanf("%d" , &T);
while (T--)
{
scanf("%d%d" , &n , &m);
for(register int i = 1; i <= n; i++) pt[i].clear() , deg[i] = 0;
tot = 0;
memset(h , 0 , sizeof h);
int x , y , z;
for(register int i = 1; i <= m; i++)
scanf("%d%d%d" , &x , &y , &z) , add(x , y , z);
for(register int i = 1; i <= n; i++)
{
scanf("%d" , &x) , deg[i] = x;
for(register int j = 1; j <= x; j++)
scanf("%d" , &y) , pt[y].push_back(i);
}
dijkstra();
}
}
Invade the Mars的更多相关文章
- hdu 3873 Invade the Mars(有限制的最短路 spfa+容器)
Invade the Mars Time Limit: 5000/2000 MS (Java/Others) Memory Limit: 365768/165536 K (Java/Others ...
- hdu3873 Invade the Mars 有限制的最短路
此段略过.看完题目,觉得这真的是一道好题目.自己有想法,但是实现起来却很难.看题解,写代码,然后写题解,意义何在?我不认为自己总是这么弱.就算抄代码,我也要有自己的理解.菜鸟总会成长. 首先,题目必须 ...
- HDU 3873 Invade the Mars(带限制条件的Dijkstra)
题目网址:http://acm.hdu.edu.cn/showproblem.php?pid=3873 思路: 军队可以先等待在城市外面,等保护该城市的城市都被攻破后,直接进城(即进城不用耗费时间). ...
- 【转】最短路&差分约束题集
转自:http://blog.csdn.net/shahdza/article/details/7779273 最短路 [HDU] 1548 A strange lift基础最短路(或bfs)★254 ...
- 【转载】图论 500题——主要为hdu/poj/zoj
转自——http://blog.csdn.net/qwe20060514/article/details/8112550 =============================以下是最小生成树+并 ...
- 【HDOJ图论题集】【转】
=============================以下是最小生成树+并查集====================================== [HDU] How Many Table ...
- 2011 Multi-University Training Contest 4 - Host by SDU
A.Color the Simple Cycle(polya计数+字符串匹配) 此题的难点在于确定置换的个数,由a[i+k]=a[i], e[i+k]=e[i]联想到KMP. 于是把原串和原串扩大两倍 ...
- hdu图论题目分类
=============================以下是最小生成树+并查集====================================== [HDU] 1213 How Many ...
- 转载 - 最短路&差分约束题集
出处:http://blog.csdn.net/shahdza/article/details/7779273 最短路 [HDU] 1548 A strange lift基础最短路(或bfs)★ ...
- 最短路&查分约束
[HDU] 1548 A strange lift 根蒂根基最短路(或bfs)★ 2544 最短路 根蒂根基最短路★ 3790 最短路径题目 根蒂根基最短路★ 2066 一小我的观光 根蒂根基最短路( ...
随机推荐
- GO开发工具litelDE的安装与使用
1.MinGW的下载与安装 地址:http://sourceforge.net/projects/mingw/ 下载安装 D:\Program Files\MinGW 然后打开D:\Program F ...
- 【Java SE进阶】Day12 函数式接口、函数式编程(Lambda表达式)
一.函数式接口介绍 1.概念 仅有一个抽象方法的接口 适用于函数式编程(Lambda使用的接口) 语法糖:方便但原理不变,如for-each是Iterator的语法糖 Lambda≈匿名内部类的语法糖 ...
- 【每日一题】【DFS】2022年1月5日-543. 二叉树的直径
给定一棵二叉树,你需要计算它的直径长度.一棵二叉树的直径长度是任意两个结点路径长度中的最大值.这条路径可能穿过也可能不穿过根结点. 答案: /** * Definition for a binary ...
- flutter系列之:flutter中的变形金刚Transform
目录 简介 Transform简介 Transform的使用 总结 简介 虽然我们在开发APP的过程中是以功能为主,但是有时候为了美观或者其他的特殊的需求,需要对组件进行一些变换.在Flutter中这 ...
- 盘点JAVA中基于CAS实现的原子类, 你知道哪些?
前言 JDK中提供了一系列的基于CAS实现的原子类,CAS 的全称是Compare-And-Swap,底层是lock cmpxchg指令,可以在单核和多核 CPU 下都能够保证比较交换的原子性.所以说 ...
- Go语言使用场景 | go语言与其它开源语言比较 | Go WEB框架选型
一.Go语言使用场景 1. 关于go语言 2007年,受够了C++煎熬的Google首席软件工程师Rob Pike纠集Robert Griesemer和Ken Thompson两位牛人,决定创造一种新 ...
- vue 实现一键复制功能(两种方式)
方法 一 : <div class="mask-cont"> <p><input id="input" /></p&g ...
- C语言函数值传递问题
C语言函数间值传递问题 错误示例 #include <stdio.h> int * pop() { int a[3]; // 定义的局部变量a[3]在调用完之后自动释放其空间 int i ...
- solidity 内存(memory) 可变数组的增删改查 操作
// SPDX-License-Identifier: MIT pragma solidity ^0.8.9; library Array { function push(uint256[] memo ...
- 10分钟在 Rainbond 上部署 mall 电商项目
很多小伙伴在学习 mall 电商项目时,都会在部署上折腾许久,虽然目前已经提供了很多种部署方式,比如 在 Linux 上部署 mall .使用 Docker 或 DockerCompose 部署 ma ...