Aizu2249 Road Construction(dijkstra优化+思路 好题)
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优化+思路 好题)的更多相关文章
- Aizu-2249 Road Construction(dijkstra求最短路)
Aizu - 2249 题意:国王本来有一个铺路计划,后来发现太贵了,决定删除计划中的某些边,但是有2个原则,1:所有的城市必须能达到. 2:城市与首都(1号城市)之间的最小距离不能变大. 并且在这2 ...
- 【Aizu - 2249】Road Construction(最短路 Dijkstra算法)
Road Construction Descriptions Mercer国王是ACM王国的王者.他的王国里有一个首都和一些城市.令人惊讶的是,现在王国没有道路.最近,他计划在首都和城市之间修建道路, ...
- POJ3352 Road Construction (双连通分量)
Road Construction Time Limit:2000MS Memory Limit:65536KB 64bit IO Format:%I64d & %I64u Sub ...
- POJ 3177 Redundant Paths POJ 3352 Road Construction(双连接)
POJ 3177 Redundant Paths POJ 3352 Road Construction 题目链接 题意:两题一样的.一份代码能交.给定一个连通无向图,问加几条边能使得图变成一个双连通图 ...
- POJ-3352 Road Construction,tarjan缩点求边双连通!
Road Construction 本来不想做这个题,下午总结的时候发现自己花了一周的时间学连通图却连什么是边双连通不清楚,于是百度了一下相关内容,原来就是一个点到另一个至少有两条不同的路. 题意:给 ...
- poj 3352 Road Construction【边双连通求最少加多少条边使图双连通&&缩点】
Road Construction Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 10141 Accepted: 503 ...
- 【Tarjan缩点】PO3352 Road Construction
Road Construction Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 12532 Accepted: 630 ...
- POJ P3352 Road Construction 解题报告
P3352 Road Construction 描述 这几乎是夏季,这意味着它几乎是夏季施工时间!今年,负责岛屿热带岛屿天堂道路的优秀人士,希望修复和升级岛上各个旅游景点之间的各种道路. 道路本身也很 ...
- [POJ3352]Road Construction
[POJ3352]Road Construction 试题描述 It's almost summer time, and that means that it's almost summer cons ...
随机推荐
- SQL Server生成数据库的数据字典存储过程
use fpErp --指定要生成数据字典的数据库 go SELECT 表名=case when a.colorder=1 then d.name else '' end, 表说明=case whe ...
- python全栈开发day87~91-整个流程梳理、CRM功能、知识点梳理
1.流程 1. stark组件 1. 启动 2.注册 3.url设计 4.视图函数设计 1.展示数据头 2.展示数据 3.list_display功能实现 4.list_display_links 功 ...
- markdown 语法小结
1 标题 # 一级标题 ## 二级标题 2 字体加粗和斜体 *斜体* **加粗** 3.引用 > 4.换行 空行 或两个空格+tab 5.无序列表 + 第一个 + 第二个 - 第一个 - 第二 ...
- CentOS7.5安装nodejs 转
CentOS7.5安装nodejs CentOS安装NodeJS 在CentOS下安装NodeJS有以下几种方法.使用的CentOS版本为7.2.CentOS其他版本的NodeJS安装大同小异,也可以 ...
- React 入门实例教程(转载)
现在最热门的前端框架,毫无疑问是 React . 上周,基于 React 的 React Native 发布,结果一天之内,就获得了 5000 颗星,受瞩目程度可见一斑. React 起源于 Face ...
- Http和RPC区别
本文转自:https://blog.csdn.net/mou_it/article/details/79873612 RPC(即Remote Procedure Call,远程过程调用)和HTTP(H ...
- IEnumerable 与 IEnumerable<T>
转自:https://blog.csdn.net/qq_21419015/article/details/80495322 IEnumerable 和IEnumerable<T> 接口在 ...
- oracle中
select tmp_tb.*, ROWNUM row_id from (SELECT MX.* --这里不能直接用* ...
- 工作记录之 [ python请求url ] v s [ java请求url ]
背景: 模拟浏览器访问web,发送https请求url,为了实验需求需要获取ipv4数据包 由于不做后续的内容整理(有内部平台分析),故只要写几行代码请求发送https请求url列表中的url即可 开 ...
- Scala-Unit7-Scala并发编程模型AKKA
一.Akka简介 Akka时spark的底层通信框架,Hadoop的底层通信框架时rpc. 并发的程序编写很难,但是Akka解决了spark的这个问题. Akka构建在JVM平台上,是一种高并发.分布 ...