题意:给出n个点,m条边权为1的无向边,破坏最多的道路,使得从s1到t1,s2到t2的距离不超过d1,d2

因为最后s1,t1是连通的,且要破坏掉最多的道路,那么就是求s1到t1之间的最短路

用bfs求出任意两个顶点之间的距离, 如果d[s1][t1]>d1||d[s2][t2]>d2,那么不可能

然后就枚举重叠的区间(就像题解里面说的"H"形一样)

如果枚举区间是1--n,1--i的话,需要交换四次

如果枚举区间是1--n,1--n的话,则只需要交换一次就可以了

看的这一篇题解:http://www.cnblogs.com/qscqesze/p/4487498.html

交换一次的

 #include<iostream>
#include<cstdio>
#include<cstring>
#include <cmath>
#include<stack>
#include<vector>
#include<map>
#include<set>
#include<queue>
#include<algorithm>
using namespace std; #define foreach(i,c) for (__typeof(c.begin()) i = c.begin(); i != c.end(); ++i) typedef long long LL;
const int INF = (<<)-;
const int mod=;
const int maxn=; int n,m;
vector<int> e[maxn];
int vis[maxn];
int d[maxn][maxn]; int main(){
scanf("%d %d",&n,&m);
for(int i=;i<=m;i++){
int u,v;
scanf("%d %d",&u,&v);
e[u].push_back(v);
e[v].push_back(u);
} int s1,t1,d1,s2,t2,d2;
scanf("%d %d %d %d %d %d",&s1,&t1,&d1,&s2,&t2,&d2); for(int i=;i<=n;i++){
queue<int> q;
memset(vis,,sizeof(vis));
vis[i]=;
q.push(i); while(!q.empty()){
int u=q.front();q.pop(); for(int j=;j<e[u].size();j++){
int v=e[u][j];
if(vis[v]) continue;
vis[v]=;
d[i][v]=d[i][u]+;
q.push(v);
}
}
} if(d[s1][t1]>d1||d[s2][t2]>d2) {
puts("-1");
return ;
} int ans=d[s1][t1]+d[s2][t2];
for(int i=;i<=n;i++){
for(int j=;j<=n;j++){
if(d[s1][i]+d[i][j]+d[j][t1]<=d1&&d[s2][i]+d[i][j]+d[j][t2]<=d2)
ans=min(ans,d[s1][i]+d[i][j]+d[j][t1]+d[s2][i]+d[j][t2]); if(d[s1][i]+d[i][j]+d[j][t1]<=d1&&d[t2][i]+d[i][j]+d[j][s2]<=d2)
ans=min(ans,d[s1][i]+d[i][j]+d[j][t1]+d[t2][i]+d[j][s2]);
}
}
printf("%d\n",m-ans);
return ;
}

交换四次的

 #include<iostream>
#include<cstdio>
#include<cstring>
#include <cmath>
#include<stack>
#include<vector>
#include<map>
#include<set>
#include<queue>
#include<algorithm>
using namespace std; #define foreach(i,c) for (__typeof(c.begin()) i = c.begin(); i != c.end(); ++i) typedef long long LL;
const int INF = (<<)-;
const int mod=;
const int maxn=; int n,m;
vector<int> e[maxn];
int vis[maxn];
int d[maxn][maxn]; int main(){
scanf("%d %d",&n,&m);
for(int i=;i<=m;i++){
int u,v;
scanf("%d %d",&u,&v);
e[u].push_back(v);
e[v].push_back(u);
} int s1,t1,d1,s2,t2,d2;
scanf("%d %d %d %d %d %d",&s1,&t1,&d1,&s2,&t2,&d2); for(int i=;i<=n;i++){
queue<int> q;
memset(vis,,sizeof(vis));
vis[i]=;
q.push(i); while(!q.empty()){
int u=q.front();q.pop(); for(int j=;j<e[u].size();j++){
int v=e[u][j];
if(vis[v]) continue;
vis[v]=;
d[i][v]=d[i][u]+;
q.push(v);
}
}
} if(d[s1][t1]>d1||d[s2][t2]>d2) {
puts("-1");
return ;
} int ans=d[s1][t1]+d[s2][t2];
for(int i=;i<=n;i++){
for(int j=;j<=i;j++){
if(d[s1][i]+d[i][j]+d[j][t1]<=d1&&d[s2][i]+d[i][j]+d[j][t2]<=d2)
ans=min(ans,d[s1][i]+d[i][j]+d[j][t1]+d[s2][i]+d[j][t2]); if(d[s1][i]+d[i][j]+d[j][t1]<=d1&&d[t2][i]+d[i][j]+d[j][s2]<=d2)
ans=min(ans,d[s1][i]+d[i][j]+d[j][t1]+d[t2][i]+d[j][s2]); if(d[t1][i]+d[i][j]+d[j][s1]<=d1&&d[s2][i]+d[i][j]+d[j][t2]<=d2)
ans=min(ans,d[t1][i]+d[i][j]+d[j][s1]+d[s2][i]+d[j][t2]); if(d[t1][i]+d[i][j]+d[j][s1]<=d1&&d[t2][i]+d[i][j]+d[j][s2]<=d2)
ans=min(ans,d[t1][i]+d[i][j]+d[j][s1]+d[t2][i]+d[j][s2]);
}
}
printf("%d\n",m-ans);
return ;
}

加油---g00000000----

codeforces 544 D Destroying Roads 【最短路】的更多相关文章

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

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

  2. CF Destroying Roads (最短路)

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

  3. Codeforces 543.B Destroying Roads

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

  4. Codeforces 543B Destroying Roads(最短路)

    题意: 给定一个n个点(n<=3000)所有边长为1的图,求最多可以删掉多少条边后,图满足s1到t1的距离小于l1,s2到t2的距离小于l2. Solution: 首先可以分两种情况讨论: 1: ...

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

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

  6. Codeforces Gym 100338C Important Roads 最短路+Tarjan找桥

    原题链接:http://codeforces.com/gym/100338/attachments/download/2136/20062007-winter-petrozavodsk-camp-an ...

  7. Codeforces.567E.President and Roads(最短路 Dijkstra)

    题目链接 \(Description\) 给定一张有向图,求哪些边一定在最短路上.对于不一定在最短路上的边,输出最少需要将其边权改变多少,才能使其一定在最短路上(边权必须为正,若仍不行输出NO). \ ...

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

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

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

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

随机推荐

  1. Unity3D——加入剑痕效果(PocketRPG Trail插件)

    首先非常感谢大家的支持,因为近期项目吃紧,所以更新的速度可能会有点慢!希望大家谅解,当然大家的支持是我最大的动力.我也会尽我所能写出更好的文章,当然因为本人是个新手并且工作的内容也不是unity3D. ...

  2. zzulioj--1790-- 弹珠游戏(数学水题!)

    弹珠游戏 Time Limit: 1 Sec  Memory Limit: 128 MB Submit: 14  Solved: 10 SubmitStatusWeb Board Descriptio ...

  3. R学习小计

    安装R扩展包:install.packages("FKF")http://www.douban.com/note/243004605/1.输入数据 l读入有分隔符数据:A<- ...

  4. Android 手势

    GestureDetector:手势监听类,通常在View的setOnTouchListener方法中设置TouchListener,在TouchListener的onTouch函数中把MotionE ...

  5. 利用@keyframe及animation做一个页面Loading时的小动画

    前言 利用@keyframe规则和animation常用属性做一个页面Loading时的小动画. 1  @keyframe规则简介 @keyframes定义关键帧,即动画每一帧执行什么. 要使用关键帧 ...

  6. http请求post,返回excel文件,并接收

    1.post的方法里要加responseType: 'arraybuffer'参数,不然下载的excel会乱码 2.使用{type: "application/vnd.ms-excel&qu ...

  7. HDU 3584 Cube 【 三维树状数组 】

    题意:还是那篇论文里面讲到的,三维树状数组http://wenku.baidu.com/view/1e51750abb68a98271fefaa8画个立方体出来对照一下好想一点 #include< ...

  8. continue和break

    <script type="text/javascript"> var i=1; computer: while(true){ i++; switch(i){ case ...

  9. ActiveMQ:JMS开源框架入门介绍

    介绍基本的JMS概念与开源的JMS框架ActiveMQ应用,内容涵盖一下几点: 基本的JMS概念 JMS的消息模式 介绍ActiveMQ 一个基于ActiveMQ的JMS例子程序 一:JMS基本概念 ...

  10. Linux ping 不通 域名 添加DNS

    修改路由配置文件 vi /etc/resolv.conf # Generated by NetworkManager #NDS nameserver 192.168.32.2 redhat7 系统优化 ...