CF543B Destroying Roads 题解
看到没有题解就贡献一波呗
分析:
这题其实就是想让我们求一个图中两条最短路的最短(好把更多的边删掉)。
我们先考虑一条最短路,别问我我怎么会的显然,就是s和t跑个最短路再用n-就行。
然后就是两条喽!这不就是做两次吗,我太巨了!
这当然是可以的
——不过只是一种情况
考虑到我们的两条路径可能会有重合,我们只好枚举重合最短路的左右端点,将路径分为5段(6段?)来处理。
然后问题基本就解决了,最开始把两两点之间预处理出最短路,这里要注意bfs即可别告诉我你要用Floyd
最后的答案如果比m大就-1了。
l1,l2的限制条件不要忘了判断鸭!
代码:
#include<cstdio>
#include<queue>
#include<iostream>
#include<vector>
#include<cstring>
using namespace std;
int d[3005][3005];
int vis[3005];
vector<int>e[3005];
void bfs(int s)
{
memset(vis,0,sizeof(vis));
queue<int>q;
q.push(s);
//vis[s]=1;
d[s][s]=0;
while(!q.empty())
{
int x=q.front();q.pop();
if(vis[x])continue;
vis[x]=1;
for(int i=0;i<e[x].size();i++)
{
int y=e[x][i];
if(d[s][y]==-1)
{
d[s][y]=d[s][x]+1;
//printf("%d\n",d[s][y]);
q.push(y);
}
}
}
}
int main()
{
int n,m;
scanf("%d%d",&n,&m);
memset(d,-1,sizeof(d));
for(int i=1;i<=m;i++)
{
int x,y;
scanf("%d%d",&x,&y);
e[x].push_back(y);
e[y].push_back(x);
}
int s1,t1,l1,s2,t2,l2;
scanf("%d%d%d",&s1,&t1,&l1);
scanf("%d%d%d",&s2,&t2,&l2);
for(int i=1;i<=n;i++)
{
// printf("qaq\n");
bfs(i);
}
/*for(int i=0;i<=n;i++)
{
for(int j=0;j<=n;j++)
{
printf("%d ",d[i][j]);
}
printf("\n");
}*/
int ans=999999999;
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
{
if(d[s1][i]+d[i][j]+d[j][t1]>l1)continue;
if(d[s2][i]+d[i][j]+d[j][t2]>l2)continue;
ans=min(ans,d[s1][i]+d[i][j]+d[j][t1]+d[s2][i]+d[i][j]+d[j][t2]-d[i][j]);
}
}
if(d[s1][t1]<=l1&&d[s2][t2]<=l2)
{
ans=min(ans,d[s1][t1]+d[s2][t2]);
}
swap(s2,t2);
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
{
if(d[s1][i]+d[i][j]+d[j][t1]>l1)continue;
if(d[s2][i]+d[i][j]+d[j][t2]>l2)continue;
ans=min(ans,d[s1][i]+d[i][j]+d[j][t1]+d[s2][i]+d[i][j]+d[j][t2]-d[i][j]);
}
}
if(d[s1][t1]<=l1&&d[s2][t2]<=l2)
{
ans=min(ans,d[s1][t1]+d[s2][t2]);
}
if(ans>m)printf("-1\n");
else
printf("%d\n",m-ans);
return 0;
}
CF543B Destroying Roads 题解的更多相关文章
- CF543B Destroying Roads 枚举 + 思维 + BFS
Code: #include <bits/stdc++.h> #define ll long long #define setIO(s) freopen(s".in", ...
- Codeforces Round #302 (Div. 2) D. Destroying Roads 最短路
题目链接: 题目 D. Destroying Roads time limit per test 2 seconds memory limit per test 256 megabytes input ...
- Codeforces Round #302 (Div. 2) D - Destroying Roads 图论,最短路
D - Destroying Roads Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/contest/544 ...
- CF Destroying Roads (最短路)
Destroying Roads time limit per test 2 seconds memory limit per test 256 megabytes input standard in ...
- Codeforces 543.B Destroying Roads
B. Destroying Roads time limit per test 2 seconds memory limit per test 256 megabytes input standard ...
- Codeforces Round #302 (Div. 1) B - Destroying Roads
B - Destroying Roads 思路:这么菜的题我居然想了40分钟... n^2枚举两个交汇点,点与点之间肯定都跑最短路,取最小值. #include<bits/stdc++.h> ...
- [CF544] D. Destroying Roads
D. Destroying Roads time limit per test 2 seconds memory limit per test 256 megabytes input standard ...
- Codeforces GYM 100876 J - Buying roads 题解
Codeforces GYM 100876 J - Buying roads 题解 才不是因为有了图床来测试一下呢,哼( 题意 给你\(N\)个点,\(M\)条带权边的无向图,选出\(K\)条边,使得 ...
- B. Destroying Roads
Destroying Roads 题目链接 题意 n个点,m条边每两个点之间不会有两个相同的边,然后给你两个起s1,s2和终点t1,t2; 求删除最多的边后满足两个s1到t1距离\(<=l1\) ...
随机推荐
- 让bootstrap表格自动出现水平滚动条
<div class="table-responsive"><!--表格自动出现水平滚动条-> <table id="tb_departme ...
- const char*和const char[]怎么识别?
#include <iostream> using namespace std; template<typename T> class _ischararray_; templ ...
- DIY Delphi 半透明窗体(2)
写文章的时候 脑子有点乱 unit uMainForm; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics ...
- WD-线程KTHREAD结构(WRK)
线程是系统处理器调度的基本单元,而且线程调度是在内核层完成的,所以,KTHREAD 的许多域都跟Windows 的线程调度机制有关. 找到进程的线程可以使用!process 1 2 3 kd> ...
- python的内存分配
一.前言 大多数编译型语言,变量在使用前必须先声明,其中C语言更加苛刻:变量声明必须位于代码块最开始,且在任何其他语句之前.其他语言,想C++和java,允许“随时随地”声明变量,比如,变量声明可以在 ...
- C语言实现常用数据结构——图
#include<stdio.h> #include<stdlib.h> #define SIZE 20 #define LENGTH(a) (sizeof(a)/sizeof ...
- 前端页面统计beacon调研
目录 为什么使用beacon beacon特性 beacon 示例 参考资料 主要用于测试html的新特性beacon,使用beacon向后端发送请求,代替xhr或jsonp, 好处是支持页面unlo ...
- 为什么建议大家使用 Linux 开发
Linux 能用吗? 我身边还有些朋友对 linux 的印象似乎还停留在黑乎乎的命令行界面上.当我告诉他或者建议他使用 linux 时,会一脸惊讶的问我,那个怎么用(来开发或者日常使用)? Linux ...
- CentOS 操作防火墙
1:查看防火状态 systemctl status firewalld 2:暂时关闭防火墙 systemctl stop firewalld 3:永久关闭防火墙 systemctl disable f ...
- Codeforces 755A:PolandBall and Hypothesis(暴力)
http://codeforces.com/problemset/problem/755/A 题意:给出一个n,让你找一个m使得n*m+1不是素数. 思路:暴力枚举m判断即可. #include &l ...