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. nginx 日志 cron任务切割日志

    #vim cut_nginx_log.sh #cd /usr/local/nginx/logs/ #/bin/mv access.log access_$(date +%F).log #/usr/lo ...

  2. P1605 迷宫 dfs回溯法

    题目背景 迷宫 [问题描述] 给定一个N*M方格的迷宫,迷宫里有T处障碍,障碍处不可通过.给定起点坐标和 终点坐标,问: 每个方格最多经过1次,有多少种从起点坐标到终点坐标的方案.在迷宫 中移动有上下 ...

  3. 20165235 学习基础和C语言基础调查

    20165235 学习基础和C语言基础调查 首先第一个问题:你有什么技能比大多人(超过90%以上)更好?感觉很难回答这种问题,其实我对很多东西挺感兴趣的,如果非要拿出一种比较突出的技能的话我感觉就是象 ...

  4. day60 pymysql

    预知扩展内容,详见地址如下(关于数据库备份和恢复) http://www.cnblogs.com/linhaifeng/articles/7525619.html 我们一般写程序都是在py文件里面,那 ...

  5. Python 2 和 3 的区别记录

    Python 2 和 3 的区别记录 print 2:关键字,可以 print a,也可以 print(a) 3:内置函数,必须带(),print(a) reload() 2:内置函数,可以直接使用 ...

  6. Python 解决 :NameError: name 'reload' is not defined 问题

    对于 Python 2.X: import sys reload(sys) sys.setdefaultencoding("utf-8") 1 2 3 对于 <= Pytho ...

  7. ZOJ 1109 Language of FatMouse 【Trie树】

    <题目链接> 题目大意: 刚开始每行输入两个单词,第二个单词存入单词库,并且每行第二个单词映射着对应的第一个单词.然后每行输入一个单词,如果单词库中有相同的单词,则输出它对应的那个单词,否 ...

  8. JS变量声明方式

    在JavaScript中有三种声明变量的方式:const  var let const:用于声明常量.注意:定义的变量的时候,必须同时初始化,且其值之后不可以修改. var:最常用的声明变量关键字.  ...

  9. Ajax技术使用之ajax与模态框结合的妙用

    Ajax技术使用之ajax与模态框结合的妙用 要求: 使用ajax的方式提交数据:https://www.cnblogs.com/-wenli/p/10470063.html 使用模态框完成增加数据, ...

  10. hdu3944

    hdu3944题目中给出的杨辉三角形的形状带有误导目的,应该转化成对称的形状再去思考这个问题分两种情况第一个是在左区从目标位置向左上方走一直走到边界,然后再向右上方一直走到起点n-k个1加上C(n-k ...