HDU 2066 一个人的旅行(Dijkstrea)
2017-05-20 08:44
381 查看
http://acm.hdu.edu.cn/showproblem.php?pid=2066
分析:
典型的最短路问题 不过要注意几点
1、草儿的家所在的城镇没有火车 她要去与她家相邻的城镇坐车 起始位置是车站 有多个起点 但是我们可以将草儿的家记作0 到车站的距离为0 这样就有一个起点了
2、题目没有告诉有多少个城市 所以要记录一下最大的城市编号
AC代码:
#include <stdio.h>
#include <string.h>
#include <algorithm>
using namespace std;
#define inf 0x3f3f3f3f
int map[1005][1005];
int vis[1005];
int dis[1005];
int n;
void Dijkstra(){
int v;
for (int i=0;i<=n;i++){
dis[i]=map[0][i];
vis[i]=0;
}
dis[0]=0;
vis[0]=1;
for (int i=1;i<=n;i++){
int minn=inf;
for (int j=1;j<=n;j++){
if(!vis[j]&&dis[j]<minn){
minn=dis[j];
v=j;
}
}
vis[v]=1;
for (int j=1;j<=n;j++){
if(!vis[j]&&dis[j]>dis[v]+map[v][j]){
dis[j]=dis[v]+map[v][j];
}
}
}
}
int main (){
int T,S,D;
while (scanf ("%d%d%d",&T,&S,&D)!=EOF){
for (int i=0;i<=1000;i++){
for (int j=0;j<=1000;j++){
if(i!=j)
map[i][j]=inf;
else
map[i][j]=0;
}
}
n=-1;
for (int i=0;i<T;i++){
int a,b,t;
scanf ("%d%d%d",&a,&b,&t);
n=max(max(a,b),n);// 找的最大的城市编号
if(map[a][b]>t){
map[a][b]=t;
map[b][a]=t;
}
}
for (int i=0;i<S;i++){ // 草儿的家为0
int x;
scanf ("%d",&x);
map[0][x]=0;
map[x][0]=0;
}
Dijkstra();
int l;
int minn=inf;
for (int i=0;i<D;i++){
scanf ("%d",&l);// 草儿想去的地方
if(dis[l]<minn){
minn=dis[l];
}
}
printf ("%d\n",minn);
}
return 0;
}
分析:
典型的最短路问题 不过要注意几点
1、草儿的家所在的城镇没有火车 她要去与她家相邻的城镇坐车 起始位置是车站 有多个起点 但是我们可以将草儿的家记作0 到车站的距离为0 这样就有一个起点了
2、题目没有告诉有多少个城市 所以要记录一下最大的城市编号
AC代码:
#include <stdio.h>
#include <string.h>
#include <algorithm>
using namespace std;
#define inf 0x3f3f3f3f
int map[1005][1005];
int vis[1005];
int dis[1005];
int n;
void Dijkstra(){
int v;
for (int i=0;i<=n;i++){
dis[i]=map[0][i];
vis[i]=0;
}
dis[0]=0;
vis[0]=1;
for (int i=1;i<=n;i++){
int minn=inf;
for (int j=1;j<=n;j++){
if(!vis[j]&&dis[j]<minn){
minn=dis[j];
v=j;
}
}
vis[v]=1;
for (int j=1;j<=n;j++){
if(!vis[j]&&dis[j]>dis[v]+map[v][j]){
dis[j]=dis[v]+map[v][j];
}
}
}
}
int main (){
int T,S,D;
while (scanf ("%d%d%d",&T,&S,&D)!=EOF){
for (int i=0;i<=1000;i++){
for (int j=0;j<=1000;j++){
if(i!=j)
map[i][j]=inf;
else
map[i][j]=0;
}
}
n=-1;
for (int i=0;i<T;i++){
int a,b,t;
scanf ("%d%d%d",&a,&b,&t);
n=max(max(a,b),n);// 找的最大的城市编号
if(map[a][b]>t){
map[a][b]=t;
map[b][a]=t;
}
}
for (int i=0;i<S;i++){ // 草儿的家为0
int x;
scanf ("%d",&x);
map[0][x]=0;
map[x][0]=0;
}
Dijkstra();
int l;
int minn=inf;
for (int i=0;i<D;i++){
scanf ("%d",&l);// 草儿想去的地方
if(dis[l]<minn){
minn=dis[l];
}
}
printf ("%d\n",minn);
}
return 0;
}
相关文章推荐
- HDU 2066 一个人的旅行
- HDU 2066 一个人的旅行(地杰斯特拉)
- hdu 2066 一个人的旅行
- HDU 2066 一个人的旅行 (最短路----floyd && dijkstra)
- hdu 2066 一个人的旅行
- HDU 2066 一个人的旅行.
- HDU 2066 一个人的旅行(Dijkstra求特殊点的单源最短路径)
- hdu 2066 一个人的旅行 (dij+heap)
- HDU 2066 一个人的旅行 (裸的dij)
- HDU 2066 一个人的旅行
- hdu 2066 一个人的旅行(最短路径 Dijkstra算法)
- hdu 2066 一个人的旅行
- hdu 2066一个人的旅行(多源最短路径Floyd)
- hdu 2066 一个人的旅行 (多源最短路 Floyd)
- HDOJ 2066 HDU 2066 一个人的旅行 ACM 2066 IN HDU
- HDU 2066 一个人的旅行
- HDU 2066 一个人的旅行
- hdu 2066(一个人的旅行)
- HDU 2066 一个人的旅行
- hdu 2066 一个人的旅行 最短路spfa