【堆优化Dijkstra+字典序最短路方案】HDU1385-Minimum Transport Cost
【题目大意】
给出邻接矩阵以及到达各个点需要付出的代价(起点和终点没有代价),求出从给定起点到终点的最短路,并输出字典序最小的方案。
【思路】
在堆优化Dijkstra中,用pre记录前驱。如果新方案和旧方案相等,比较两个方案的字典序。
【坑点】
我先求出了最短路(包括终点要付出代价),输出的时候再减去终点的代价。
有可能会给出S==T的情况……在这种情况下,最短路就是0,减去代价要变成负数了QAQ所以要特判一下。坑了好几个小时orz
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cstdlib>
#include<cmath>
#include<queue>
#include<vector>
using namespace std;
const int MAXN=+;
const int INF=0x7fffffff; struct edge
{
int to,len;
}; vector<edge> E[MAXN];
priority_queue<pair<int,int>,vector<pair<int,int> >,greater<pair<int,int> > > pque;
int vis[MAXN],dis[MAXN],pre[MAXN],tax[MAXN];
int s1[MAXN],s2[MAXN],n; void addedge(int u,int v,int w)
{
E[u].push_back((edge){v,w});
} void init()
{
for (int i=;i<MAXN;i++) vector<edge>().swap(E[i]);
while (!pque.empty()) pque.pop();
for (int i=;i<=n;i++)
for (int j=;j<=n;j++)
{
int aij;
scanf("%d",&aij);
if (aij>= && i!=j) addedge(i,j,aij);
}
for (int i=;i<=n;i++) scanf("%d",&tax[i]);
} int compare(int now,int before)
{
memset(s1,,sizeof(s1));
memset(s2,,sizeof(s2));
int i=,j=-;
s1[]=before;
while (now!=) s1[++i]=now,now=pre[now];
while (before!=) s2[++j]=before,before=pre[before];
for (;i>= && j>=;i--,j--)
if (s1[i]<s2[j]) return ;
else if (s1[i]>s2[j]) return ;
return (s1<s2);
} int dijkstra(int S,int T)
{
for (int i=;i<=n;i++) vis[i]=,dis[i]=INF,pre[i]=-;
dis[S]=,pre[S]=;
pque.push(pair<int,int>(,S));
while (!pque.empty())
{
int u=pque.top().second;pque.pop();
vis[u]=;
for (int i=;i<E[u].size();i++)
{
int v=E[u][i].to,len=E[u][i].len+tax[v];
if (dis[v]>=dis[u]+len)
{
if (dis[v]>dis[u]+len)
{
dis[v]=dis[u]+len;
pre[v]=u;
pque.push(pair<int,int>(dis[v],v));
}
else if (dis[v]==dis[u]+len && compare(u,v))
{
pre[v]=u;
pque.push(pair<int,int>(dis[v],v));
}
}
}
} int i=,now=T;
while (now!=) s1[++i]=now,now=pre[now];
printf("From %d to %d :\n",S,T);
printf("Path: ");
while (i>=)
{
printf("%d",s1[i--]);
if (i!=) printf("-->");
}
printf("\nTotal cost : %d\n\n",(S==T)?:dis[T]-tax[T]);
//注意如果S==T的时候,就不要减去tax了,否则会出现负值。
} void solve()
{
int a,b;
while (scanf("%d%d",&a,&b))
{
if (a==- && a==b) return;
dijkstra(a,b);
}
} int main()
{
while (scanf("%d",&n))
{
if (n==) break;
init();
solve();
}
return ;
}
附上随机数据生成:
#include<bits/stdc++.h>
using namespace std; int main()
{
freopen("samplein.txt", "w", stdout);
srand((unsigned)time(NULL));
int n=rand() % ;
int ne;
cout<<n<<endl;
for (int i=;i<n;i++)
{
for (int j=;j<n;j++)
{
if (i==j)
{
printf("%d",);
}
else
{
if((rand()%n)<(n/))
{
printf("-1");
}
else
{
printf("%d",(rand()%(n-)+));
}
}
printf(" ");
}
printf("\n"); } for (int i=;i<n;i++)
{
printf("%d ",(rand()%n));
} printf("\n");
int tmp=rand()%n;
for (int i=;i<tmp;i++)
{
int temp1=(rand()%(n-)+);
int temp2=(rand()%(n-)+);
printf("%d %d\n",temp1,temp2); } printf("%d %d\n",-,-);
printf("%d\n",); fclose(stdout);
return ;
}
【堆优化Dijkstra+字典序最短路方案】HDU1385-Minimum Transport Cost的更多相关文章
- 堆优化Dijkstra计算最短路+路径计数
今天考试的时候遇到了一道题需要路径计数,然而蒟蒻从来没有做过,所以在考场上真的一脸懵逼.然后出题人NaVi_Awson说明天考试还会卡SPFA,吓得我赶紧又来学一波堆优化的Dijkstra(之前只会S ...
- HDU1385 Minimum Transport Cost (Floyd)
Minimum Transport Cost Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/O ...
- hdu1385 Minimum Transport Cost 字典序最小的最短路径 Floyd
求最短路的算法最有名的是Dijkstra.所以一般拿到题目第一反应就是使用Dijkstra算法.但是此题要求的好几对起点和终点的最短路径.所以用Floyd是最好的选择.因为其他三种最短路的算法都是单源 ...
- BZOJ 3040 最短路 (堆优化dijkstra)
这题不是裸的最短路么?但是一看数据范围就傻了.点数10^6,边数10^7.这个spfa就别想了(本来spfa就是相当不靠谱的玩意),看来是要用堆优化dijkstra了.但是,平时写dijkstra时为 ...
- POJ 3635 - Full Tank? - [最短路变形][手写二叉堆优化Dijkstra][配对堆优化Dijkstra]
题目链接:http://poj.org/problem?id=3635 题意题解等均参考:POJ 3635 - Full Tank? - [最短路变形][优先队列优化Dijkstra]. 一些口胡: ...
- PAT-1030 Travel Plan (30 分) 最短路最小边权 堆优化dijkstra+DFS
PAT 1030 最短路最小边权 堆优化dijkstra+DFS 1030 Travel Plan (30 分) A traveler's map gives the distances betwee ...
- 【bzoj1097】[POI2007]旅游景点atr 状压dp+堆优化Dijkstra
题目描述 FGD想从成都去上海旅游.在旅途中他希望经过一些城市并在那里欣赏风景,品尝风味小吃或者做其他的有趣的事情.经过这些城市的顺序不是完全随意的,比如说FGD不希望在刚吃过一顿大餐之后立刻去下一个 ...
- 【bzoj4016】[FJOI2014]最短路径树问题 堆优化Dijkstra+DFS树+树的点分治
题目描述 给一个包含n个点,m条边的无向连通图.从顶点1出发,往其余所有点分别走一次并返回. 往某一个点走时,选择总长度最短的路径走.若有多条长度最短的路径,则选择经过的顶点序列字典序最小的那条路径( ...
- UVA - 11374 - Airport Express(堆优化Dijkstra)
Problem UVA - 11374 - Airport Express Time Limit: 1000 mSec Problem Description In a small city c ...
随机推荐
- console.dir() 与 console.dirxml() 的使用
在调试JavaScript程序时,有时需要dump某些对象的详细信息.通过手工编写JavaScript代码可以完成这一工作:针对对象的属性进行循环,将循环到的每一个属性值打印出来:可见,这一过程是比较 ...
- Python之 context manager
在context manager中,必须要介绍两个概念: with as... , 和 enter , exit. 下文将先介绍with语句,然后介绍 __enter__和exit, 最后介绍cont ...
- xshell5 优化方案
有道云笔记链接-> grep: 过滤 过滤的速度是最快的(相对于另外两个) -v -n -o 显示grep匹配到了什么 grep . -o -i --ignore-case -E == ...
- 运用java反射
Class类 要正确使用Java反射机制就得使用java.lang.Class这个类.它是Java反射机制的起源.当一个类被加载以后,Java虚拟机就会自动产生一个Class对象.通过这个Class对 ...
- 16 Go Concurrency Patterns: Timing out, moving on GO并发模式: 超时, 继续前进
Go Concurrency Patterns: Timing out, moving on GO并发模式: 超时, 继续前进 23 September 2010 Concurrent progra ...
- WebApi参数问题方案
原文:http://www.cnblogs.com/landeanfen/p/5337072.html
- html-表格和列表
一:表格标签 表格 描述 <table> 定义表格 <caption> 定义表格标题. <th> 定义表格的表头. <tr> 定义表格的行. <t ...
- Shell编程学习1--基础了解
"#!path"告诉系统path所指的程序为用来解释此脚本文件的Shell程序: 如#!/bin/sh, #!/bin/bash Shell Script的后缀名为.sh; ech ...
- HBase入门笔记--读性能优化
一.前言 在生产环境使用HBase过程中,随着数据量的不断增加,查询HBase数据变得越来越慢,对于业务来说是不可用的,需要对读性能进行优化 二.问题定位 从hbase监控指标来看,发现FullGC次 ...
- RelativeLayout
<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android=&q ...