题意:

  给定一个n个点(n<=3000)所有边长为1的图,求最多可以删掉多少条边后,图满足s1到t1的距离小于l1,s2到t2的距离小于l2。


Solution:

  首先可以分两种情况讨论:

    1:假设最后留下的边是互不相交的两条路径。此时的答案是n-s1到t1的最短路径-s2到t2的最短路径。

2:假设最后留下的边有重合的一段,此时只要枚举重合的这一段的起点和终点,就可以判断。注意此时要考虑这两条路径经过枚举的两点的顺序。

限制的条件比较多,可以用来剪枝的条件也很多。

由于所有边的长度为1,用DFS或者SPFA算法可以很快地求出最短路。

#include <bits/stdc++.h>
using namespace std; const int N = ; struct edge {
int v, ne;
} E[N * N << ];
int head[N], cnt; int n, m, ans;
int s1, s2, t1, t2, l1, l2; int dis[][N];
int vis[N]; void SPFA (int S, int k) {
queue<int> q;
memset (vis, , sizeof vis);
dis[k][S] = ;
vis[S] = ;
q.push (S);
while (!q.empty() ) {
int u = q.front(); q.pop();
for (int i = head[u]; i; i = E[i].ne) {
int v = E[i].v;
if (dis[k][u] + < dis[k][v]) {
dis[k][v] = dis[k][u] + ;
if (!vis[v]) {
vis[v] = ;
q.push (v);
}
}
}
vis[u] = ;
}
} inline void add (int u, int v) {
E[++cnt].v = v, E[cnt].ne = head[u];
head[u] = cnt;
} int main() {
ios::sync_with_stdio ();
cin >> n >> m;
for (int i = , u, v; i <= m; ++i) {
cin >> u >> v;
add (u, v), add (v, u);
}
cin >> s1 >> t1 >> l1;
cin >> s2 >> t2 >> l2;
memset (dis, 0x1f, sizeof dis);
SPFA (s1, );
SPFA (s2, );
SPFA (t1, );
SPFA (t2, );
if (dis[][t1] <= l1 && dis[][t2] <= l2) {
ans = dis[][t1] + dis[][t2];
for (int i = ; i <= n; ++i) {
int flag = ;
for (int k = ; k <= n; ++k) dis[][k] = ;
for (int j = i + ; j <= n; ++j) {
int tem1 = min (dis[][i] + dis[][j], dis[][j] + dis[][i]);
int tem2 = min (dis[][i] + dis[][j], dis[][j] + dis[][i]);
if (tem1 + tem2 < ans && tem1 < l1 && tem2 < l2) {
if (!flag) {
SPFA (i, );
flag = ;
}
if (tem1 + dis[][j] <= l1 && tem2 + dis[][j] <= l2) {
ans = min (ans, tem1 + tem2 + dis[][j]);
}
}
}
}
}
else {
ans = m + ;
}
cout << m - ans << endl;
}

Codeforces 543B Destroying Roads(最短路)的更多相关文章

  1. [CodeForces] 543B Destroying Roads

    脑洞+暴力. 因为边权是1,所以bfs一下,O(n^2)求任意两点间最短路,再枚举. ans最大是\(dis_{s1,t1}+dis_{s2,t2}\) 再考虑有公共边的情况,一定存在两个点 u, v ...

  2. Codeforces Round #302 (Div. 2) D. Destroying Roads 最短路

    题目链接: 题目 D. Destroying Roads time limit per test 2 seconds memory limit per test 256 megabytes input ...

  3. CF Destroying Roads (最短路)

    Destroying Roads time limit per test 2 seconds memory limit per test 256 megabytes input standard in ...

  4. Codeforces Round #302 (Div. 2) D. Destroying Roads 最短路 删边

    题目:有n个城镇,m条边权为1的双向边让你破坏最多的道路,使得从s1到t1,从s2到t2的距离分别不超过d1和d2. #include <iostream> #include <cs ...

  5. Codeforces Round #302 (Div. 2) D - Destroying Roads 图论,最短路

    D - Destroying Roads Time Limit: 20 Sec  Memory Limit: 256 MB 题目连接 http://codeforces.com/contest/544 ...

  6. Codeforces 543.B Destroying Roads

    B. Destroying Roads time limit per test 2 seconds memory limit per test 256 megabytes input standard ...

  7. Codeforces Round #302 (Div. 1) B - Destroying Roads

    B - Destroying Roads 思路:这么菜的题我居然想了40分钟... n^2枚举两个交汇点,点与点之间肯定都跑最短路,取最小值. #include<bits/stdc++.h> ...

  8. [CF544D]Destroying Roads_最短路_bfs

    D. Destroying Roads 题目大意: In some country there are exactly n cities and m bidirectional roads conne ...

  9. B. Destroying Roads

    Destroying Roads 题目链接 题意 n个点,m条边每两个点之间不会有两个相同的边,然后给你两个起s1,s2和终点t1,t2; 求删除最多的边后满足两个s1到t1距离\(<=l1\) ...

随机推荐

  1. UIView hitTest的原理

    [转自:http://blog.sina.com.cn/s/blog_59fb90df0101ab26.html] UIView 两个方法: - (UIView *)hitTest:(CGPoint) ...

  2. HDOJ/HDU 2539 点球大战(String.endsWith()方法的一个应用~)

    Problem Description 在足球比赛中,有不少赛事,例如世界杯淘汰赛和欧洲冠军联赛淘汰赛中,当比赛双方经过正规比赛和加时赛之后仍然不分胜负时,需要进行点球大战来决定谁能够获得最终的胜利. ...

  3. 更改Tomcat startup.bat启动窗口名称

    通常在Tomcat bin目录下用startup.bat启动Tomcat ,启动窗口显示的Title是Tomcat 如果遇到一个服务器上多个Tomcat的话就会容易混淆.更改方法如下: 1 在bin目 ...

  4. 你能在windows上创建一个叫做AUX的文件夹吗?

    Windows的文件名不能有如下这些特殊符号,这个大家都比较熟悉了. < (less than) > (greater than) : (colon) " (double quo ...

  5. mac下修改mysql的默认字符集为utf8

    1,检查默认安装的mysql的字符集 mysql> show variables like '%char%'; +--------------------------+------------- ...

  6. 免费WiFi,仅仅为好久没联系的你们

    昨日,认识五年的朋友搬来与我一起住了,说不上来,没有激动,仅仅是突然感觉生活又多了一点生机.兴致上来,晚上立马联系了已经近四个月没有联系的好友,才知道他们的生活也因这几个月发生了翻天覆地的变化.究竟什 ...

  7. 对vpn的认识

    网上关于vpn的资料非常多,看后眼花缭乱,仍然感觉一片混沌.网上,网下參考一些资料后.试着理清一些概念问题,由于,概念理清了,找到门了,才不至于左右徘徊,一片混沌. 首先vpn,这个我们都知道叫虚拟专 ...

  8. shuffle() 函数(转)

    定义和用法 shuffle() 函数把数组中的元素按随机顺序重新排列. 若成功,则返回 TRUE,否则返回 FALSE. 注释:本函数为数组中的单元赋予新的键名.这将删除原有的键名而不仅是重新排序. ...

  9. ExtJs4学习(四):Extjs 中id与itemId的差别

       为了方便表示或是指定一个组件的名称,我们一般会使用id或者itemId进行标识命名. (推荐尽量使用itemId.这样能够降低页面唯一标识而产生的冲突) id:   id是作为整个页面的Comp ...

  10. MySQL查询语句执行过程及性能优化(JOIN/ORDER BY)-图

    http://blog.csdn.net/iefreer/article/details/12622097 MySQL查询语句执行过程及性能优化-查询过程及优化方法(JOIN/ORDER BY) 标签 ...