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. 洛谷---小L和小K的NOIP考后放松赛

    链接: https://www.luogu.org/contestnew/show/11805?tdsourcetag=s_pcqq_aiomsg 题解: 没人过的题我就没看 t2: 考虑每个点是朋友 ...

  2. Ubuntu下使用Evernote

    Ubuntu下安装使用Evernote http://blog.csdn.net/yangzhuoluo/article/details/8118996 http://blog.csdn.net/ya ...

  3. sed 简单修改配置文件ip地址

    sed -i 's/old ip/new ip/g' file.txt

  4. DateFormat抽象类实现日期与字符串的转换

    [需求]日期是可以计算的,而日期字符串无法计算. 由于DateFormat是抽象类,我们一般都是用的它的子类SimpleDateFormat. [SimpleDateFormat构造方法] 1)Sim ...

  5. P2661 信息传递 二分图的最小环

    题目描述 有 nn 个同学(编号为 11 到 nn )正在玩一个信息传递的游戏.在游戏里每人都有一个固定的信息传递对象,其中,编号为 ii 的同学的信息传递对象是编号为 T_iTi​ 的同学. 游戏开 ...

  6. 058 kafka与log4j集成

    1.首先在resources下面写log4j.properties 主要是因为kafka.producer.KafkaLog4jAppender类的存在. log4j.rootLogger=INFO, ...

  7. Python中type和object

    type  所有类是type生成的 a = 1 b = "abc" print("type a:{}".format(type(a))) print(" ...

  8. 使用soupUI做接口测试

    第一步:点击“file”,选择测试项目采用的协议:(这里我们测试的是http协议的,所以选择第三项)   第二步:在弹窗中输入测试项目的接口URL,并点击“OK”: 第三步:设置和填写请求项的内容并点 ...

  9. 基本标签-html-1

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  10. Windows10 下Apache服务器搭建

    Windows10 下Apache服务器搭建   转 https://blog.csdn.net/sunqian666888/article/details/78561399 目录 一.软件下载 二. ...