CF #257 div2D:http://codeforces.com/contest/450/problem/D

题意:给你n个城市,m条无向有权边。另外还有k条边,每条边从起到到i。求可以删除这k条边中的多少条,使得每个点到1的最短距离不变。

题解:通过这一题明白了,对于一个问题要有分析思考的能力。首先分析一下,对于城市i,(1)如果没有从1到i的特殊边(即上述k条中的一条),我们不用考虑。(2)如果有,在这之前已经求出了每个点的最短路,如果这条边的边权大于等于最短路,则可以直接删除,一不会影响本身的最短路,二不会影响别的城市,因为别的城市可以通过当前已经求得的最短路进行松弛。(3)如果这个边权边权小于最短路,那么我们把最短路路径修改为这个距离,接下就要判断,能否通过其它的点来求得当前的最短路或者更短,很明显,如果能够求得到这个距离,说明可以通过其它点来得到这个最短路,那么这一条路径可以删除了,否则就是唯一的。对于这一来说,如果用链式前向星来存图的话,我的是T了,也许是哪里没有处理好,改成Vecotr就A了。这确实是不错的题目。

 #include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<queue>
#include<vector>
#define INF 10000000000000000LL
#define ll long long
using namespace std;
const int N=1e5+;
const int M=*1e5+;
int n,m,k,ans,u,v;
long long temp,dist1[N],dist2[N],dist3[N];
bool flag[N],visit[N];
struct Edge{
int v;
ll w;
Edge(int vi, ll wi) : v(vi), w(wi){}
Edge(){}
};
vector<Edge>G[N];
void SPFA1(int u){
for(int i=;i<=n;i++){
dist1[i]=INF;
visit[i]=;
}
queue<int>Q;
dist1[u]=;
visit[u]=;
Q.push(u);
while(!Q.empty()){
int v=Q.front();
Q.pop();
visit[v]=;
for (int i = ; i < G[v].size(); i++){
int d = G[v][i].v; ll w = G[v][i].w;
if(dist1[d]>dist1[v]+w){
dist1[d]=dist1[v]+w;
if(!visit[d]){
Q.push(d);
visit[d]=;
}
}
}
}
}
void SPFA2(int u){
for(int i=;i<=n;i++){
visit[i]=;
dist3[i]=INF;
}
queue<int>Q;
dist3[u]=;
visit[u]=;
Q.push(u);
for(int i=;i<=n;i++){
if(dist2[i]<dist1[i]){
Q.push(i);
visit[i]=;
dist3[i]=dist2[i];
}
}
while(!Q.empty()){
int v=Q.front();
Q.pop();
visit[v]=;
for (int i = ; i < G[v].size(); i++){
int d = G[v][i].v; ll w = G[v][i].w;
if(dist3[d]>dist3[v]+w){
dist3[d]=dist3[v]+w;
if(!visit[d]){
Q.push(d);
visit[d]=;
}
if(flag[d]){
ans++;
flag[d]=;
}
}
else if(dist3[d]==dist3[v]+w){
if(flag[d]){
ans++;
flag[d]=;
}
}
}
}
}
int main(){
while(~scanf("%d%d%d",&n,&m,&k)){
for (int i = ; i <= n; i++) G[i].clear();
for(int i=;i<=m;i++){
scanf("%d%d%I64d",&u,&v,&temp);
G[u].push_back(Edge(v,temp));
G[v].push_back(Edge(u,temp));
}
SPFA1();
ans=;memset(flag,,sizeof(flag));
for(int i=;i<=n;i++)
dist2[i]=dist1[i];
for(int i=;i<=k;i++){
scanf("%d%I64d",&v,&temp);
if(dist2[v]<=temp)ans++;
else{
dist2[v]=temp;
if(flag[v])ans++;
flag[v]=;
}
}
SPFA2();
printf("%d\n",ans);
}
}

Jzzhu and Cities的更多相关文章

  1. CF449B Jzzhu and Cities (最短路)

    CF449B CF450D http://codeforces.com/contest/450/problem/D http://codeforces.com/contest/449/problem/ ...

  2. Codeforces Round #257 (Div. 2) D题:Jzzhu and Cities 删特殊边的最短路

    D. Jzzhu and Cities time limit per test 2 seconds memory limit per test 256 megabytes input standard ...

  3. Codeforces 449 B. Jzzhu and Cities

    堆优化dijkstra,假设哪条铁路能够被更新,就把相应铁路删除. B. Jzzhu and Cities time limit per test 2 seconds memory limit per ...

  4. Codeforces C. Jzzhu and Cities(dijkstra最短路)

    题目描述: Jzzhu and Cities time limit per test 2 seconds memory limit per test 256 megabytes input stand ...

  5. CF449B Jzzhu and Cities 迪杰斯特拉最短路算法

    CF449B Jzzhu and Cities 其实这一道题并不是很难,只是一个最短路而已,请继续看我的题解吧~(^▽^) AC代码: #include<bits/stdc++.h> #d ...

  6. Codeforces 450D:Jzzhu and Cities(最短路,dijkstra)

    D. Jzzhu and Cities time limit per test: 2 seconds memory limit per test: 256 megabytes input: stand ...

  7. D. Jzzhu and Cities

    Jzzhu is the president of country A. There are n cities numbered from 1 to n in his country. City 1  ...

  8. codeforces 449B Jzzhu and Cities (Dij+堆优化)

    输入一个无向图<V,E>    V<=1e5, E<=3e5 现在另外给k条边(u=1,v=s[k],w=y[k]) 问在不影响从结点1出发到所有结点的最短路的前提下,最多可以 ...

  9. Codeforces Round #257(Div.2) D Jzzhu and Cities --SPFA

    题意:n个城市,中间有m条道路(双向),再给出k条铁路,铁路直接从点1到点v,现在要拆掉一些铁路,在保证不影响每个点的最短距离(距离1)不变的情况下,问最多能删除多少条铁路 分析:先求一次最短路,铁路 ...

  10. Codeforces 450D Jzzhu and Cities [heap优化dij]

    #include<bits/stdc++.h> #define MAXN 100050 #define MAXM 900000 using namespace std; struct st ...

随机推荐

  1. Struts2 入门(新手必看)

    船舶停靠在港湾是很安全的,但这不是造船的目的     Struts 2及其优势 Struts 2是一个MVC框架,以WebWork框架的设计思想为核心,吸收了Struts 1的部分优点 Struts ...

  2. js点击弹出div层

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  3. 嵌入式C语言优化小技巧

    嵌入式C语言优化小技巧 1 概述 嵌入式系统是指完成一种或几种特定功能的计算机系统,具有自动化程度高,响应速度快等优点,目前已广泛应用于消费电子,工业控制等领域.嵌入式系统受其使用的硬件以及运行环境的 ...

  4. 【动态页面】(二)Java反射

    Java的反射机制是Java语言非常重要的一个特性.先从Sun官网上看一下官网是怎样定义反射机制的. 大致翻译一下,翻译的可能不是非常准确. 反射(Reflection)是Java程序设计语言的一个特 ...

  5. erlang怎样有效监听大量并发连接

    看了erlang的一些开源网络框架RabbitMQ.Ranch.他们都使用多个进程同一时候accept一个socket. 这样的方式在使得socketport监听的工作分担了很多其它的调度机会.可是, ...

  6. July收集荷兰国旗问题之三路partition

    这道题目和分成两块的partition的扩展.比如有一堆0 1 2 数字组成的数组,要分成 00 00  11 1 1  222 2这样的顺序的. 利用lumoto版的partition能够非常好的解 ...

  7. PermGen space错误解决方法

    在看下文之前,首先要确认意见事情,就是你是怎样启动tomcat的,我们在平时的开发环境其中,都是通过startup.bat方式启动tomcat的,那么你依照以下的方式,去改动/bin/catalina ...

  8. 论C++与三国

    Scott Meyers曾说过,C++语言是一个语言联邦.C++包含面向过程,面向对象,泛型编程编程思想.现在C++11有加了一堆新特性,语言联邦更为庞大. 程序员们.常常挑起语言之争,甚至连大师级人 ...

  9. Java基础知识强化之IO流笔记07:自定义的异常概述和自定义异常实现

    1. 开发的时候往往会出现很多问题(java内部系统框架中没有提供这些异常) 比如说:考试成绩必须在0~100之间. 很明显java没有对应的异常,需要我们自己来做一个异常. (1)继承自Except ...

  10. linux sysvinit与upstart [转]

    linux sysvinit与upstart(1) linux sysvinit与upstart(2) linux sysvinit与upstart(3)