CF Destroying Roads (最短路)
2 seconds
256 megabytes
standard input
standard output
In some country there are exactly n cities and m bidirectional roads connecting the cities. Cities are numbered with integers from 1 to n. If cities a and b are connected by a road, then in an hour you can go along this road either from city a to city b, or from city b to city a. The road network is such that from any city you can get to any other one by moving along the roads.
You want to destroy the largest possible number of roads in the country so that the remaining roads would allow you to get from city s1 to city t1 in at most l1 hours and get from city s2 to city t2 in at most l2 hours.
Determine what maximum number of roads you need to destroy in order to meet the condition of your plan. If it is impossible to reach the desired result, print -1.
The first line contains two integers n, m (1 ≤ n ≤ 3000, ) — the number of cities and roads in the country, respectively.
Next m lines contain the descriptions of the roads as pairs of integers ai, bi (1 ≤ ai, bi ≤ n, ai ≠ bi). It is guaranteed that the roads that are given in the description can transport you from any city to any other one. It is guaranteed that each pair of cities has at most one road between them.
The last two lines contains three integers each, s1, t1, l1 and s2, t2, l2, respectively (1 ≤ si, ti ≤ n, 0 ≤ li ≤ n).
Print a single number — the answer to the problem. If the it is impossible to meet the conditions, print -1.
5 4
1 2
2 3
3 4
4 5
1 3 2
3 5 2
0
5 4
1 2
2 3
3 4
4 5
1 3 2
2 4 2
1
5 4
1 2
2 3
3 4
4 5
1 3 2
3 5 1
-1 用dijkstra把每个点都跑一遍,求出任意点之间的最短路,然后先假设两条路之间没重叠,那么可以拆的路就是M - 最短路a - 最短路b,再假设有重叠,枚举他们重叠的段。要注意有可能出现起点和终点要互换的情况。
#include <bits/stdc++.h>
using namespace std; const int INF = 0xfffffff;
const int SIZE = ;
int N,M,D[SIZE][SIZE];
int s_1,t_1,l_1,s_2,t_2,l_2;
bool S[SIZE];
struct Q_Node
{
int d,vec;
bool operator <(const Q_Node & r) const
{
return d > r.d;
};
};
vector<int> G[SIZE]; void dijkstra(int);
int main(void)
{
int from,to; scanf("%d%d",&N,&M);
for(int i = ;i < M;i ++)
{
scanf("%d%d",&from,&to);
G[from].push_back(to);
G[to].push_back(from);
}
for(int i = ;i <= N;i ++)
dijkstra(i); scanf("%d%d%d",&s_1,&t_1,&l_1);
scanf("%d%d%d",&s_2,&t_2,&l_2);
if(D[s_1][t_1] > l_1 || D[s_2][t_2] > l_2)
{
puts("-1");
return ;
} int min = D[s_1][t_1] + D[s_2][t_2];
int ans = ;
for(int i = ;i <= N;i ++)
for(int j = ;j <= N;j ++)
{
if(min > D[s_1][i] + D[s_2][i] + D[i][j] + D[j][t_1] + D[j][t_2])
if(D[s_1][i] + D[i][j] + D[j][t_1] <= l_1 &&
D[s_2][i] + D[i][j] + D[j][t_2] <= l_2)
min = D[s_1][i] + D[s_2][i] + D[i][j] + D[j][t_1] + D[j][t_2];
if(min > D[t_1][i] + D[t_2][i] + D[i][j] + D[j][s_1] + D[j][s_2])
if(D[t_1][i] + D[i][j] + D[j][s_1] <= l_1 &&
D[t_2][i] + D[i][j] + D[j][s_2] <= l_2)
min = D[t_1][i] + D[t_2][i] + D[i][j] + D[j][s_1] + D[j][s_2];
if(min > D[t_1][i] + D[s_2][i] + D[i][j] + D[j][s_1] + D[j][t_2])
if(D[t_1][i] + D[i][j] + D[j][s_1] <= l_1 &&
D[s_2][i] + D[i][j] + D[j][t_2] <= l_2)
min = D[t_1][i] + D[s_2][i] + D[i][j] + D[j][s_1] + D[j][t_2];
if(min > D[s_1][i] + D[t_2][i] + D[i][j] + D[j][t_1] + D[j][s_2])
if(D[s_1][i] + D[i][j] + D[j][t_1] <= l_1 &&
D[t_2][i] + D[i][j] + D[j][s_2] <= l_2)
min = D[s_1][i] + D[t_2][i] + D[i][j] + D[j][t_1] + D[j][s_2];
}
printf("%d\n",M - min); return ;
} void dijkstra(int s)
{
priority_queue<Q_Node> que;
Q_Node temp;
for(int i = ;i <= N;i ++)
{
D[s][i] = INF;
S[i] = false;
}
D[s][s] = ;
temp.d = ;
temp.vec = s;
que.push(temp); while(!que.empty())
{
int cur = que.top().vec;
que.pop();
S[cur] = true; for(int i = ;i < G[cur].size();i ++)
if(!S[G[cur][i]] && D[s][G[cur][i]] > D[s][cur] + )
{
D[s][G[cur][i]] = D[s][cur] + ;
temp.vec = G[cur][i];
temp.d = D[s][G[cur][i]];
que.push(temp);
}
}
}
CF Destroying Roads (最短路)的更多相关文章
- 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 543B Destroying Roads(最短路)
题意: 给定一个n个点(n<=3000)所有边长为1的图,求最多可以删掉多少条边后,图满足s1到t1的距离小于l1,s2到t2的距离小于l2. Solution: 首先可以分两种情况讨论: 1: ...
- Codeforces Round #302 (Div. 2) D. Destroying Roads 最短路 删边
题目:有n个城镇,m条边权为1的双向边让你破坏最多的道路,使得从s1到t1,从s2到t2的距离分别不超过d1和d2. #include <iostream> #include <cs ...
- Codeforces Round #302 (Div. 2) D - Destroying Roads 图论,最短路
D - Destroying Roads Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/contest/544 ...
- 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> ...
- [CF544D]Destroying Roads_最短路_bfs
D. Destroying Roads 题目大意: In some country there are exactly n cities and m bidirectional roads conne ...
- B. Destroying Roads
Destroying Roads 题目链接 题意 n个点,m条边每两个点之间不会有两个相同的边,然后给你两个起s1,s2和终点t1,t2; 求删除最多的边后满足两个s1到t1距离\(<=l1\) ...
- [CF544] D. Destroying Roads
D. Destroying Roads time limit per test 2 seconds memory limit per test 256 megabytes input standard ...
随机推荐
- RecyclerView 下拉刷新上拉加载
步骤: 首先直接定义一个XRecyclerView继承RecyclerView,重写他的三个构造方法. init(Context mContext)方法用来初始化底部加载的view 回到XRecycl ...
- UserControl和CustomControl基础【PluraSight】
UserControl UserControl实际上就是ContentControl,xaml里<UserControl></UserControl>tag之间包含的实际就是后 ...
- 导入导出Excel
最近需要频繁的使用导入导出,各么,又不想使用ms的PIA,在4.0以下,存在版本兼容的问题. 于是网上查找了很久,找到两款开源的excel组件. 1.CSharpJExcel,这是JExcel的.ne ...
- thinkphp 3+ 观后详解 (4)
static public function run() { // 应用初始化标签 Hook::listen('app_init'); App::init(); // 应用开始标签 Hook::lis ...
- IOS开发之路四(UITabBarController)
前两天看了看斯坦福大学的iphone开发公开课,讲的倒是不错,可看的我云里雾里的,不怎么讲基础和原理,不太适合初学者.今天看了一上午ios5基础教程这本书感觉有点头绪了....废话少说,讲一讲我上午做 ...
- cocos2d-x android黑屏后返回游戏卡顿
转自:http://blog.csdn.net/wolfking_2009/article/details/8824931 2013年5月17日更新:对于之前说的资源释放问题,cocos2d-x 2. ...
- c# 轻量级 ORM 框架 之 DBHelper 实现 (三)
周末了比较清闲,把自己的orm框架整理了下,开源了. 已经做出来的东西通常感觉有些简单,一些新手或许听到"框架"一类的词觉得有些"高深",简单来说orm就是把a ...
- jQuery:在一个回调中处理多个请求
我曾经为Mozilla Developer Network 开发一个新功能,它需要加载一个基本的脚本文件的同时加载一个JSON请求.因为我们使用的是jQuery,意味着要使用 jQuery.getSc ...
- Ruby Scripting - Array
A literal array is created by putting squarebrackets around a comma-separated list of elements eg: # ...
- uva 387 A Puzzling Problem (回溯)
A Puzzling Problem The goal of this problem is to write a program which will take from 1 to 5 puzz ...