codeforces 567 E. President and Roads 【 最短路 桥 】
给出一个有向图,从起点走到终点(必须走最短路),问一条边是否一定会被经过,如果不经过它,可以减小它的多少边权使得经过它(边权不能减少到0)
正反向建图,分别求出起点到每个点的最短距离,终点到每个点的最短距离(用这个可以算出减小的边权)
再将在最短路径上的边重新建图。求出里面的桥,就是必须经过的边
wa了一上午------呜呜呜呜
先wa 19 是因为求桥的时候是无向图,数组开小了一半
然后 wa 46 ,是因为dis[]数组初始化为 1 << 30 -1 ,应该再开大点 ,开成 1 << 50 -1
我写成 1 LL * 50 -----一直wa 19------
5555555555555555555--------sad-------
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <cmath>
#include <vector>
#include <map>
#include <set>
#include <stack>
#include <queue>
#include <iostream>
#include <algorithm>
using namespace std;
#define lp (p << 1)
#define rp (p << 1|1)
#define getmid(l,r) (l + (r - l) / 2)
#define MP(a,b) make_pair(a,b)
typedef long long ll;
typedef unsigned long long ull;
typedef pair<int,int> pii;
const int INF = ( << ) - ;
const int maxn = ; int N,M;
ll path;
int first1[maxn],nxt1[ * maxn],ecnt1;
int first2[maxn],nxt2[ *maxn],ecnt2;
int first[maxn],nxt[*maxn],ecnt;
ll dis1[maxn],dis2[maxn]; int bg[*maxn],vis[*maxn],low[maxn],dfn[maxn];
int ans[*maxn],res[maxn];
int tot,num; struct edge{
int v,u,cost;
int tag;
int ge;
int id;
friend bool operator < (edge a,edge b){
return a.cost > b.cost;
}
}; edge e1[*maxn],e2[*maxn],e[*maxn]; void init(){
ecnt1 = ecnt2 = ecnt = ;
memset(first1,-,sizeof(first1));
memset(first2,-,sizeof(first2));
memset(first,-,sizeof(first));
} void Add_edge1(int u,int v,int c){
nxt1[++ecnt1] = first1[u];
e1[ecnt1].u = u;
e1[ecnt1].v = v;
e1[ecnt1].cost = c;
e1[ecnt1].tag = ;
e1[ecnt1].ge = ;
first1[u] = ecnt1;
} void Add_edge2(int u,int v,int c){
nxt2[++ecnt2] = first2[u];
e2[ecnt2].v = v;
e2[ecnt2].cost = c;
e2[ecnt2].tag = ;
e2[ecnt2].ge = ;
first2[u] = ecnt2;
} void Add_edge(int u,int v,int c){
nxt[ecnt] = first[u];
e[ecnt].v = v;
e[ecnt].u = u;
e[ecnt].id = c;
first[u] = ecnt++; nxt[ecnt] = first[v];
e[ecnt].v = u;
e[ecnt].u = v;
e[ecnt].id = c;
first[v] = ecnt++;
} struct cmp{
bool operator ()(pii a,pii b){
return a.first > b.first;
}
}; void Dijstra1(int s){
priority_queue<pii,vector<pii >,cmp> PQ;
dis1[s] = ;
PQ.push(MP(dis1[s],s));
int cnt = ;
while(!PQ.empty()){
pii x = PQ.top(); PQ.pop();
if(dis1[x.second] < x.first) continue;
for(int i = first1[x.second]; i != -; i = nxt1[i]){
int v = e1[i].v;
if(dis1[v] > dis1[x.second] + e1[i].cost){
dis1[v] = dis1[x.second] + e1[i].cost;
PQ.push(MP(dis1[v],v));
}
}
}
} void Dijstra2(int s){
priority_queue<pii,vector<pii >,cmp> PQ;
dis2[s] = ;
PQ.push(MP(dis2[s],s));
int cnt = ;
while(!PQ.empty()){
pii x = PQ.top(); PQ.pop();
if(dis2[x.second] < x.first) continue;
for(int i = first2[x.second]; i != -; i = nxt2[i]){
int v = e2[i].v;
if(dis2[v] > dis2[x.second] + e2[i].cost){
dis2[v] = dis2[x.second] + e2[i].cost;
PQ.push(MP(dis2[v],v));
}
}
}
} void Dfs(int p,int pre){
dfn[p] = low[p] = ++tot;
for(int i = first[p]; ~i; i = nxt[i]){
int v = e[i].v;
if(vis[i]) continue;
vis[i] = vis[i ^ ] = true;
if(!dfn[v]){
Dfs(v,p);
low[p] = min(low[p],low[v]);
if(low[v] > dfn[p]) {
bg[i] = bg[i ^ ] = true;
ans[e[i].id] = ;
}
}
else low[p] = min(low[p],dfn[v]);
}
} void Tarjan(){
memset(dfn,,sizeof(dfn));
memset(low,,sizeof(low));
memset(bg,false,sizeof(bg));
memset(vis,false,sizeof(vis));
tot = ;
for(int i = ; i <= N; ++i) if( dfn[i] == ) Dfs(i,-);
} void solve(){
memset(res,-,sizeof(res));
for(int i = ;i <= M;i++){
int u = e1[i].u;
int v = e1[i].v;
if(ans[i] == ) {
res[i] = ;
continue;
}
ll need = path - dis1[u] - dis2[v];
if(need > ){
res[i] = e1[i].cost - need + ;
}
} for(int i = ;i <= M;i++){
if(res[i] == ) puts("YES");
else if(res[i] == -) puts("NO");
else printf("CAN %d\n",res[i]);
}
} int main(){
int a,b,c,s,t;
num = ;
while(scanf("%d%d%d%d",&N,&M,&s,&t) != EOF){
num++;
init();
int x; for(int i = ; i <= M; ++i){
scanf("%d%d%d",&a,&b,&c);
Add_edge1(a,b,c);
Add_edge2(b,a,c);
} for(int i = ;i <= N;i++) dis1[i] = dis2[i] = 1ll << ; Dijstra1(s);
Dijstra2(t);
path = dis1[t]; for(int u = ;u <= N;u++){
for(int i = first1[u];~i;i = nxt1[i]){
int v = e1[i].v;
if(dis1[u] + dis2[v] + e1[i].cost == path) {
e1[i].tag = ;
e2[i].tag = ;
Add_edge(u,v,i);
}
}
} memset(ans,,sizeof(ans));
Tarjan();
solve();
}
return ;
}
codeforces 567 E. President and Roads 【 最短路 桥 】的更多相关文章
- Codeforces Round #Pi (Div. 2) E. President and Roads 最短路+桥
题目链接: http://codeforces.com/contest/567/problem/E 题意: 给你一个带重边的图,求三类边: 在最短路构成的DAG图中,哪些边是必须经过的: 其他的(包括 ...
- 【CodeForces 567E】President and Roads(最短路)
Description Berland has n cities, the capital is located in city s, and the historic home town of th ...
- Codeforces.567E.President and Roads(最短路 Dijkstra)
题目链接 \(Description\) 给定一张有向图,求哪些边一定在最短路上.对于不一定在最短路上的边,输出最少需要将其边权改变多少,才能使其一定在最短路上(边权必须为正,若仍不行输出NO). \ ...
- cf567E. President and Roads(最短路计数)
题意 题目链接 给出一张有向图,以及起点终点,判断每条边的状态: 是否一定在最短路上,是的话输出'YES' 如果不在最短路上,最少减去多少权值会使其在最短路上,如果减去后的权值\(< 1\),输 ...
- Codeforces Round #Pi (Div. 2) E. President and Roads tarjan+最短路
E. President and RoadsTime Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/contest/567 ...
- Codeforces GYM 100876 J - Buying roads 题解
Codeforces GYM 100876 J - Buying roads 题解 才不是因为有了图床来测试一下呢,哼( 题意 给你\(N\)个点,\(M\)条带权边的无向图,选出\(K\)条边,使得 ...
- 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 Gym 100338C Important Roads 最短路+Tarjan找桥
原题链接:http://codeforces.com/gym/100338/attachments/download/2136/20062007-winter-petrozavodsk-camp-an ...
- Codeforces 543B Destroying Roads(最短路)
题意: 给定一个n个点(n<=3000)所有边长为1的图,求最多可以删掉多少条边后,图满足s1到t1的距离小于l1,s2到t2的距离小于l2. Solution: 首先可以分两种情况讨论: 1: ...
随机推荐
- In-Out Parameters inout keyword
You write an in-out parameter by placing the inout keyword right before a parameter’s type. An in-ou ...
- 第一个TensorFlow程序
第一个TensorFlow程序 TensorFlow的运行方式分为如下4步: (1)加载数据及定义超参数 (2)构建网络 (3)训练模型 (4)评估模型和进行预测 import tensorflow ...
- bootstrap中container 类和container-fluid类的区别container类所谓的自适应也是通过margin的改变来完成,container-fluid类的百分百宽度是指在固有的15px的padding前提下宽度总是当前视口的宽度。
container 类和container-fluid类的区别体现在是否有随视口宽度改变的margin存在. container类所谓的自适应也是通过margin的改变来完成,container-fl ...
- css常用代码大全以及css兼容(转载)
css常见的快捷开发代码汇总(长期更新),包括CSS3代码,有一些css效果很顽固,经常会一时找不出解决方案,网络上也有很多的工具和高手提供了具体的浏览器兼容代码,这个页面我今后会经常整理,希望能够帮 ...
- Windows Server菜鸟宝典之一:Windows Server 2008 R2 AD服务器搭建
1.对于将要安装成为DC的服务器来讲,其系统配置以及基本的磁盘规划在此就不在累述了,但是关键的网络连接属性是必须要注意的.可以通过打开本地连接的属性来进行配置其IP属性.作为服务器DC的IP地 ...
- CentOS6.6安装mysql-5.7.25二进制安装包简易教程
#####1,安装前首先确认系统版本 [root@bogon:~]# cat /etc/redhat-release CentOS release 6.6 (Final) [root@bogon:~] ...
- AM335X用RGB888连接LCD如何以16位色彩模式显示图片
在AM335x中,在连接显示屏的时候,存在一个问题.这个在am335x Sillicon Errata已经提到过 在RGB888模式中 而对于RGB565模式的硬件连接 不难看出,这个RGB是反的 ...
- [SDOI2016]生成魔咒(后缀自动机)
看一眼题.本质不同的字串数. 嘴角微微上扬. 每一次加一个数输出一个答案. 笑容渐渐消失. 等等,\(SAM\)好像也可以求本质不同的字串. 设当前字符串用\(x\)表示,每次插入完成后\(ans\) ...
- spring md5 加密
一.spring 自带的 DigestUtils 工具类可以进行 md5 加密 //导入包 import org.springframework.util.DigestUtils; //对密码进行 m ...
- Maven错误-Missing artifact com.sun:tools:jar:1.5.0:system 解决方式
1.Missing artifact com.sun:tools:jar:1.5.0:system Could not resolve dependencies for project com.ifl ...