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. JSP基础知识➣语法整理(二)

    A.脚本程序 脚本程序可以包含任意量的Java语句.变量.方法或表达式,只要它们在脚本语言中是有效的. 脚本程序的语法格式:<% 代码片段 %>,但是不能包含文件的方法和变量的声明 B.J ...

  2. Migrating your code from 9.3 to 10.x

    刚发现ArcGIS Objects SDK提供了一个代码升级分析工具,用于辅助将程序从9.3升级到10.X:ArcGIS Code Migration Analyzer. 安装sdk后,在vs2010 ...

  3. pycharm中出现的错误

    错误1 在pycharm上安装TensorFlow运行import tensorflow时报错: File , in _find_and_load SystemError: PyEval_EvalFr ...

  4. P1080 国王游戏 贪心 高精度

    题目描述 恰逢 HH国国庆,国王邀请nn 位大臣来玩一个有奖游戏.首先,他让每个大臣在左.右手上面分别写下一个整数,国王自己也在左.右手上各写一个整数.然后,让这 nn 位大臣排成一排,国王站在队伍的 ...

  5. IDEA控制台问题:At least one JAR was scanned for TLDs yet contained no TLD

    参考连接: https://www.cnblogs.com/interdrp/p/7763040.html 1.调整Tomcat对应类的log级别 2.观察Tomcat日志打印信息 3.调整${tom ...

  6. 为表格动态添加一行,miniui组件无效

    想要使用miniui实现这样的功能,点击按钮,在一个<td>中动态添加一个miniui输入框和一个按钮,结果miniui的样式无法渲染,请问这种问题可以怎么解决代码如下: <tr&g ...

  7. Number String(DP)

    题目: 题意: 给你一个字符串s,s[i] = 'D'表示排列中a[i] > a[i+1],s[i] = 'I'表示排列中a[i] < a[i+1]. 比如排列 {3, 1, 2, 7, ...

  8. hadoop安装过程中出现的错误

    此次来记录一下我在安装Hadoop安装过程中出现的错误,安装过程参照慕课网林子雨教程进行安装,在尝试过程中出现的错误如下: 1.在安装Ubuntu时,新建虚拟电脑时,并没有在版本的输入框中有Ubunt ...

  9. sql语句1——join

    注:一下内容来自于http://www.w3school.com.cn/sql/ 1. 引用两个表 我们可以通过引用两个表的方式,从两个表中获取数据: 谁订购了产品,并且他们订购了什么产品? sele ...

  10. 在addroutes后,$router.options.routes没有更新的问题(手摸手,带你用vue撸后台 读后感)

    参照<着手摸手,带你用vue撸后台>一文,本人做了前端的权限判断 https://segmentfault.com/a/1190000009275424 首先就是在addroutes后,$ ...