Jzzhu and Cities
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的更多相关文章
- CF449B Jzzhu and Cities (最短路)
CF449B CF450D http://codeforces.com/contest/450/problem/D http://codeforces.com/contest/449/problem/ ...
- 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 ...
- Codeforces 449 B. Jzzhu and Cities
堆优化dijkstra,假设哪条铁路能够被更新,就把相应铁路删除. B. Jzzhu and Cities time limit per test 2 seconds memory limit per ...
- Codeforces C. Jzzhu and Cities(dijkstra最短路)
题目描述: Jzzhu and Cities time limit per test 2 seconds memory limit per test 256 megabytes input stand ...
- CF449B Jzzhu and Cities 迪杰斯特拉最短路算法
CF449B Jzzhu and Cities 其实这一道题并不是很难,只是一个最短路而已,请继续看我的题解吧~(^▽^) AC代码: #include<bits/stdc++.h> #d ...
- Codeforces 450D:Jzzhu and Cities(最短路,dijkstra)
D. Jzzhu and Cities time limit per test: 2 seconds memory limit per test: 256 megabytes input: stand ...
- 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 ...
- codeforces 449B Jzzhu and Cities (Dij+堆优化)
输入一个无向图<V,E> V<=1e5, E<=3e5 现在另外给k条边(u=1,v=s[k],w=y[k]) 问在不影响从结点1出发到所有结点的最短路的前提下,最多可以 ...
- Codeforces Round #257(Div.2) D Jzzhu and Cities --SPFA
题意:n个城市,中间有m条道路(双向),再给出k条铁路,铁路直接从点1到点v,现在要拆掉一些铁路,在保证不影响每个点的最短距离(距离1)不变的情况下,问最多能删除多少条铁路 分析:先求一次最短路,铁路 ...
- Codeforces 450D Jzzhu and Cities [heap优化dij]
#include<bits/stdc++.h> #define MAXN 100050 #define MAXM 900000 using namespace std; struct st ...
随机推荐
- hive 显示表分区真实对应数据路径
desc formatted l_ad_yclick_html partition (datecol='20160118');
- npm常用命令总结
p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Menlo; color: #000000; background-color: rgba(2 ...
- js判断字符串是否包含指定的字符
判断字符串是否包含指定字符是很常用的功能,比如说,注册时用户名限制不能输入"管理员",或者需要js判断url跳转链接是否包含某个关键词等-- <!DOCTYPE html&g ...
- 程序启动原理和UIApplication
iOS开发UI篇—程序启动原理和UIApplication 一.UIApplication 1.简单介绍 (1)UIApplication对象是应用程序的象征,一个UIApplication对象就 ...
- 将JDBC ResultSet结果集变成List
private List<Map<String, Object>> list = new ArrayList<Map<String,Object>>() ...
- python中的TCP编程学习
今天看了一下关于python的TCP编程. 发现思路和其他语言(比如java)思路基本上差点儿相同. 先看client.基本过程例如以下: 第一步:创建一个socket 第二步:建立连接 第三步:发送 ...
- Change value of string array at debug eclipse--转
Question: I have an application, but to test something, I need to change value of a String[]. But wh ...
- 笔试之STL
1. map是如何实现的?它的keys是否经过排序?如何实现它的clear方法? A 实现: map是通过红黑树来实现的,keys是经过排序的: map的所有元素都是pair,同时拥有实值(value ...
- Tomcat中Listener的使用范例(转载http://cywhoyi.iteye.com/blog/2075848)
Tomcat是非常有名的开源容器,因其开源我们可以对其做定制化的改变,而且Tomcat在其配置文件方面做了很多注释说明摘要,帮助我们更好的定制化我们所需的功能点. New Tomcat Listene ...
- android之旅——开始
1.文件的读取 io流读取文件,并且显示 package com.helloword; import java.io.BufferedReader; import java.io.File; impo ...