FJUT3591 侦测到在途的聚变打击(最小不可相交路径覆盖)题解
题意:给你n个点,点间m条路,给出在每条路要走的时间。现在有q个任务,要摧毁q个点,每次提供ci和ti表示在时间ti摧毁点ci(必须正好在时间ti才能摧毁),每个点可能需要多次摧毁(同一时间能在同一个点摧毁无数个点),允许在某个点停留任意时间。问现在要派几个小兵去摧毁点,最少派几个?
原题:

思路:小兵既然能无限停留在某个点,那么我能从t小的点走到t大的点并摧毁t大的那个点的条件,应该是这两点间最短路小于等于时间差。所以我们直接Floyd跑多源最短路。但是他只需要摧毁q个可能重复的点,不是摧毁整张图,那么我们可以这么想,把q次摧毁看成q个单独的点,每个点的距离就是他们所代表的点之间的最短路(显然相同两个点距离0),然后这样拆点得到二分图,跑最小可相交路径覆盖。
代码:
#include<set>
#include<map>
#include<stack>
#include<cmath>
#include<queue>
#include<vector>
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
typedef long long ll;
using namespace std;
const int maxn = + ;
const int seed = ;
const ll MOD = 1e9 + ;
const int INF = 0x3f3f3f3f;
struct Edge{
int v, next;
}edge[maxn * ];
int head[maxn], tot;
ll mp[][];
void addEdge(int u, int v){
edge[tot].v = v;
edge[tot].next = head[u];
head[u] = tot++;
}
void init(){
memset(head, -, sizeof(head));
memset(mp, INF, sizeof(mp));
tot = ;
}
void floyd(int n){
for(int k = ; k <= ; k++){
for(int i = ; i <= ; i++){
for(int j = ; j <= ; j++){
if(mp[i][j] > mp[i][k] + mp[k][j]){
mp[i][j] = mp[i][k] + mp[k][j];
}
}
}
}
}
int cy[maxn];
bool vis[maxn];
bool dfs(int u){
for(int i = head[u]; i != -; i = edge[i].next){
int v = edge[i].v;
if(vis[v]) continue;
vis[v] = true;
if(cy[v] == - || dfs(cy[v])){
cy[v] = u;
return true;
}
}
return false;
}
int solve(int n){
int ret = ;
memset(cy, -, sizeof(cy));
for(int i = ;i <= n; i++){
memset(vis, , sizeof(vis));
ret += dfs(i);
}
return ret;
}
int c[maxn], t[maxn];
int main(){
int n, m, q;
init();
scanf("%d%d%d", &n, &m, &q);
int u, v;
ll x;
for(int i = ; i < m; i++){
scanf("%d%d%lld", &u, &v, &x);
u++, v++;
mp[u][v] = mp[v][u] = min(mp[u][v], x);
}
for(int i = ; i <= ; i++)
mp[i][i] = ;
floyd(n);
for(int i = ; i <= q; i++)
scanf("%d%d", &c[i], &t[i]), c[i]++;
for(int i = ; i <= q; i++){
for(int j = ; j <= q; j++){
if(i == j) continue;
if(t[j] >= t[i] && mp[c[i]][c[j]] <= (t[j] - t[i])){
addEdge(i, j + q);
}
}
}
printf("%d\n", q - solve( * q));
return ;
}
FJUT3591 侦测到在途的聚变打击(最小不可相交路径覆盖)题解的更多相关文章
- 粘包解决高端_Server
from socket import * #导入套接字模块的所有命令import subprocess #导入subprocess模块,用于执行命令行import struct #导入struck模块 ...
- codevs1409 拦截导弹2
[问题描述]一场战争正在 A 国与 B 国之间如火如荼的展开.B 国凭借其强大的经济实力开发出了无数的远程攻击导弹,B 国的领导人希望,通过这些导弹直接毁灭 A 国的指挥部,从而取得战斗的胜利!当然, ...
- bzoj2044: 三维导弹拦截
Description 一场战争正在A国与B国之间如火如荼的展开. B国凭借其强大的经济实力开发出了无数的远程攻击导弹,B国的领导人希望,通过这些导弹直接毁灭A国的指挥部,从而取得战斗的胜利!当然,A ...
- 【BZOJ2044】三维导弹拦截 DP+(有上下界的)网络流
[BZOJ2044]三维导弹拦截 Description 一场战争正在A国与B国之间如火如荼的展开. B国凭借其强大的经济实力开发出了无数的远程攻击导弹,B国的领导人希望,通过这些导弹直接毁灭A国的指 ...
- bzoj AC倒序
Search GO 说明:输入题号直接进入相应题目,如需搜索含数字的题目,请在关键词前加单引号 Problem ID Title Source AC Submit Y 1000 A+B Problem ...
- 二分图最小覆盖的Konig定理及其证明,最小的覆盖证明
[转http://www.cppblog.com/abilitytao/archive/2009/09/02/95147.html -> http://yejingx.ycool.com/p ...
- 【LeetCode】1631. 最小体力消耗路径 Path With Minimum Effort
作者: 负雪明烛 id: fuxuemingzhu 个人博客:http://fuxuemingzhu.cn/ 目录 题目描述 解题思路 并查集 代码 刷题心得 欢迎加入组织 日期 题目地址:https ...
- 码途有道----基于系统观的核心能力构建-by-韩宏老师
原文链接:http://blog.sina.com.cn/s/blog_7d5a09f90102v341.html 有感于同学们在大学中如何学习计算机技术有些感概,将我书(老码识途)中的序言整理了一下 ...
- 面试web前端开发,被打击了
今天我去面试web前端开发,被打击了,也跟我也有一定的关系,最基础的东西我都没回答好,哎! 主要是我在等我有意向的公司给我发offer,闲着没事,刚好又有公司叫我去面试,我抱着多面一家也没有啥子坏处就 ...
随机推荐
- Python记录6:函数2,函数参数
# 一. 函数参数分为两大类 # 形参:在函数定义阶段括号定义的参数(变量名),称之为形式参数 #因为函数定义阶段只是用一个符号表示表示一个参数,并没有具体的值,所以称之为形式参数,形 ...
- vs使用gitflow
1.背景:之前在开发一个项目时,用tfs管理代码,并用“禁止多人编辑”来避免冲突,但仅适用于开发团队较小时.缺点: (1).开发团队较大,开发人员较多时,会出现经常互相锁,增加沟通成本.比如增加文件时 ...
- 准备dbcp2-2.1.1和pool2-2.4.2 、commons-dbcp-1.4jar包
下载地址:https://pan.baidu.com/s/1gtcW36Lz6Yt-j9WlTu31Pw
- 准备mysql-connector-java
下载mysql-connector-java:https://mvnrepository.com/artifact/mysql/mysql-connector-java 导入mysql-connect ...
- SpringMVC探究-----从HelloWorld开始
1.SpringMVC简介 Spring MVC框架是有一个MVC框架,通过实现Model-View-Controller模式来很好地将数据.业务与展现进行分离. 它的设计是围绕Dispatch ...
- css selectors tips
from https://saucelabs.com/resources/articles/selenium-tips-css-selectorsSauce Labs uses cookies to ...
- python安装cv2
pip install opencv-python
- locust 的使用
Contents Locust这一款开源性能测试工具.然而,当前在网络上针对Locust的教程极少,不管是中文还是英文,基本都是介绍安装方法和简单的测试案例演示,但对于较复杂测试场景的案例演示却基本没 ...
- Hive静态分区和动态分区
一.静态分区 1.创建分区表 hive (default)> create table order_mulit_partition( > order_number string, > ...
- ymPrompt,jcs缓存架构
jcs.auxiliary.LTCP=org.apache.jcs.auxiliary.lateral.socket.tcp.LateralTCPCacheFactory#jcs.auxiliary. ...