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. 用于A*的 二叉堆 AS3实现

    package com.copper.isometric.pathing {     import flash.sampler.startSampling;           /**      * ...

  2. C - Surprising Strings

                                   C - Surprising Strings 题意:输入一段字符串,假设在同一距离下有两个字符串同样输出Not surprising ,否 ...

  3. android抓包工具

    下载 http://gdown.baidu.com/data/wisegame/2158469c63492e89/Tcpzhuabao_2.apk

  4. java中的泛型(转)

    什么是泛型? 泛型(Generic type 或者 generics)是对 Java 语言的类型系统的一种扩展,以支持创建可以按类型进行参数化的类.可以把类型参数看作是使用参数化类型时指定的类型的一个 ...

  5. android ToolBar与DrawerLayout笔记

    通过Android Studio 生成的Nagvition DrawerLayout Activity 自带的布局中的NagvitionView会覆盖ToolBar直接通到statusBar. 但是自 ...

  6. Python操作MySQL -即pymysql/SQLAlchemy用法

    本节介绍Python对于MySQL的一些操作用法 模块1:pymysql(等同于MySQLdb) 说明:pymysql与MySQLdb模块的使用基本相同,学会pymysql,使用MySQLdb也就不是 ...

  7. access的时间相关的查询

    string sql = "select * from CONCURRENCY WHERE CONCURRENCY.DATE_FLAG BETWEEN  cdate('2013-11-1', ...

  8. Pgsql 里面 COALESCE的用法

    有这种要求,更新自己本身的字段的某个值进行加或者减, 常规方法: UPDATE tbl_kintai_print_his SET print_time = now(), print_emp_cd = ...

  9. .Net程序员 Solr-5.3之旅 (一)Solr入门

    阅读目录 引言 Lunece是什么? Solr是什么 JAVA环境搭建 JAVA环境搭建之变量配置 Tomcat简单配置 结尾 引言 君子生非异也,善假于物也. Java和.Net哪个好,我们也不需要 ...

  10. Ext4.1 grid 多选(可无checkbox)

    转载 在Ext4.1中的grid默认只能实现单选的. 如果你想要你的grid有多选功能,需要给grid增加selModel 如果你使用了Ext.create('Ext.selection.Checkb ...