https://vjudge.net/problem/Aizu-2249

感觉这题和2017女生赛的Deleting Edge思路很像,都是先找最短路,然后替换边的。

但是这题用最朴素的dijkstra的话memory limit exceed了,看了下超了约7倍无望。。。

不得已这时候不得不学dijkstra的堆优化了。

 #include<iostream>
#include<cstdio>
#include<queue>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<stack>
#define lson l, m, rt<<1
#define rson m+1, r, rt<<1|1
#define INF 0x3f3f3f3f
typedef unsigned long long ll;
using namespace std;
int n, m, a, b, d, c;
int dist[], t[][], p[][];
int vis[];
void dijkstra()
{
memset(vis, , sizeof(vis));
for(int i = ; i <= n; i++){
dist[i] = INF;
}
dist[] = ;
for(int i = ; i <= n; i++){
int mini = INF, k = -;
for(int j = ; j <= n; j++){
if(!vis[j]&&mini > dist[j]){
mini = dist[j];
k = j;
}
}
vis[k] = ;
for(int j = ; j <= n; j++){
if(!vis[j]&&dist[j] > dist[k]+t[k][j]){
dist[j] = dist[k]+t[k][j];
}
}
}
}
int main()
{
while(cin >> n >> m){
if(!n&&!m) break;
for(int i = ; i <= n; i++){
for(int j = ; j <= n; j++){
if(i == j) t[i][j] = , p[i][j] = ;
else t[i][j] = INF; p[i][j] = INF;
}
}
for(int i = ; i < m; i++){
cin >> a >> b >> d >> c;
t[a][b] = d; t[b][a] = d;
p[a][b] = c; p[b][a] = c;
}
dijkstra();
int sum=;
for(int i = ; i <= n; i++){//这里记得要从2开始,从一开始下面无法更新mini,而且反正i=1的时候mini也是0,就直接跳过了
int mini = INF;
for(int j = ; j <= n; j++){
if((dist[i] == dist[j]+t[j][i])&&mini>p[j][i]){
mini = p[j][i];
}
}
sum += mini;
}
cout << sum << endl;
}
return ;
}

优先队列、vector容器、pair优化

 #include<iostream>
#include<cstdio>
#include<queue>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<stack>
#define lson l, m, rt<<1
#define rson m+1, r, rt<<1|1
#define INF 0x3f3f3f3f
typedef unsigned long long ll;
using namespace std;
int n, m, a, b, d, c;
int dist[];
struct edge{
int to, d, cost;
//edge(int a, int b, int c):to(a),d(b),cost(c){ }
};
typedef pair<int, int> P;
vector<edge> G[];
void dijkstra()
{
priority_queue<P, vector<P>, greater<P> > q;
for(int i = ; i <= n; i++) dist[i] = INF;
dist[] = ;
q.push(P(, ));
while(!q.empty()){
P p = q.top(); q.pop();
int v = p.second;
if(dist[v] < p.first) continue;
for(int i = ; i < G[v].size(); i++){
edge e = G[v][i];
if(dist[e.to] > dist[v]+e.d){
dist[e.to] = dist[v]+e.d;
q.push(P(dist[e.to], e.to));
}
}
}
}
int main()
{
while(cin >> n >> m){
if(!n&&!m) break;
for(int i = ; i <= n; i++){
G[i].clear();
}
for(int i = ; i < m; i++){
cin >> a >> b >> d >> c;
G[a].push_back(edge{b, d, c});
G[b].push_back(edge{a, d, c});
}
dijkstra();
/*for(int i = 1; i <= n; i++){
cout << dist[i] << " ";
}*/
int sum = ;
for(int i = ; i <= n; i++){
int mini = INF;
for(int j = ; j < G[i].size(); j++){
edge e = G[i][j];
if(dist[e.to]+e.d == dist[i]){//这里注意,一开始e.d错放到等式右边了
mini = min(mini, e.cost);
}
}
sum += mini;
}
cout << sum << endl;
}
return ;
}

Aizu2249 Road Construction(dijkstra优化+思路 好题)的更多相关文章

  1. Aizu-2249 Road Construction(dijkstra求最短路)

    Aizu - 2249 题意:国王本来有一个铺路计划,后来发现太贵了,决定删除计划中的某些边,但是有2个原则,1:所有的城市必须能达到. 2:城市与首都(1号城市)之间的最小距离不能变大. 并且在这2 ...

  2. 【Aizu - 2249】Road Construction(最短路 Dijkstra算法)

    Road Construction Descriptions Mercer国王是ACM王国的王者.他的王国里有一个首都和一些城市.令人惊讶的是,现在王国没有道路.最近,他计划在首都和城市之间修建道路, ...

  3. POJ3352 Road Construction (双连通分量)

    Road Construction Time Limit:2000MS    Memory Limit:65536KB    64bit IO Format:%I64d & %I64u Sub ...

  4. POJ 3177 Redundant Paths POJ 3352 Road Construction(双连接)

    POJ 3177 Redundant Paths POJ 3352 Road Construction 题目链接 题意:两题一样的.一份代码能交.给定一个连通无向图,问加几条边能使得图变成一个双连通图 ...

  5. POJ-3352 Road Construction,tarjan缩点求边双连通!

    Road Construction 本来不想做这个题,下午总结的时候发现自己花了一周的时间学连通图却连什么是边双连通不清楚,于是百度了一下相关内容,原来就是一个点到另一个至少有两条不同的路. 题意:给 ...

  6. poj 3352 Road Construction【边双连通求最少加多少条边使图双连通&&缩点】

    Road Construction Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 10141   Accepted: 503 ...

  7. 【Tarjan缩点】PO3352 Road Construction

    Road Construction Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 12532   Accepted: 630 ...

  8. POJ P3352 Road Construction 解题报告

    P3352 Road Construction 描述 这几乎是夏季,这意味着它几乎是夏季施工时间!今年,负责岛屿热带岛屿天堂道路的优秀人士,希望修复和升级岛上各个旅游景点之间的各种道路. 道路本身也很 ...

  9. [POJ3352]Road Construction

    [POJ3352]Road Construction 试题描述 It's almost summer time, and that means that it's almost summer cons ...

随机推荐

  1. [ZJOI2006]皇帝的烦恼

    题解: 具有单调性的题目还是要多想想二分答案 不二分答案暴力dp是n^3的 非常不优秀 二分答案之后就比较好做 mx[i],nx[i]表示最多/最少几个与a[1]相同 代码: #include < ...

  2. U32592 摘果实

    链接:https://www.luogu.org/problemnew/show/U32592 题解: 60-70分 二分+网络流

  3. CGAffineTransform的使用

    typedef struct CGAffineTransform CGAffineTransform; struct CGAffineTransform { CGFloat a, b, c, d; C ...

  4. PyCharm安装使用 激活码

    从pycharm官网 [http://www.jetbrains.com/pycharm/download/#section=windows]下载完整安装包 激活码激活 优点:Window.Mac.U ...

  5. Python_collections_Counter计数器部分功能介绍

    counter():是对字典的补充,用来方便的计数,继承了字典 import collections obj = collections.Counter('yigbavfsdcfdsfdsd') pr ...

  6. Flink的Windows

    在讲解windows的众多操作之前,需要讲解一个概念: 源源不断的数据流是无法进行统计工作的,因为数据流没有边界,就无法统计到底有多少数据经过了这个流.也无法统计数据流中的最大值,最小值,平均值,累加 ...

  7. mousedown和click冲突事件

    鼠标事件,一般用button来区分鼠标的按键(DOM3标准规定: click事件只能监听左键, 只能通过mousedown和mouseup来判断鼠标键): 1.鼠标左键 button = 0 2.鼠标 ...

  8. Count the string kmp

    问题描述众所周知,aekdycoin擅长字符串问题和数论问题.当给定一个字符串s时,我们可以写下该字符串的所有非空前缀.例如:S:“ABAB”前缀是:“A”.“AB”.“ABA”.“ABAB”对于每个 ...

  9. SpringMVC-1-(简介及HelloWord)

    首先我们来看一下servlet的处理请求的方式: 一:SpringMVC简介: 一)SpringMVC中的几个重要组件 1.DispatchServlet: 前端控制器,mvc模式中的c,是整个流程的 ...

  10. spring的webutils包。适用于访问httpservletrequest和httpservletresponse

    WebUtils位 于 org.springframework.web.util 包中的 WebUtils 是一个非常好用的工具类,它对很多 Servlet API 提供了易用的代理方法,降低了访问 ...