您的位置:首页 > 其它

HDU 2066 一个人的旅行

2016-04-21 18:54 399 查看
http://acm.hdu.edu.cn/showproblem.php?pid=2066

一个人的旅行

Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 21055    Accepted Submission(s): 7335


[align=left]Problem Description[/align]虽然草儿是个路痴(就是在杭电待了一年多,居然还会在校园里迷路的人,汗~),但是草儿仍然很喜欢旅行,因为在旅途中 会遇见很多人(白马王子,^0^),很多事,还能丰富自己的阅历,还可以看美丽的风景……草儿想去很多地方,她想要去东京铁塔看夜景,去威尼斯看电影,去阳明山上看海芋,去纽约纯粹看雪景,去巴黎喝咖啡写信,去北京探望孟姜女……眼看寒假就快到了,这么一大段时间,可不能浪费啊,一定要给自己好好的放个假,可是也不能荒废了训练啊,所以草儿决定在要在最短的时间去一个自己想去的地方!因为草儿的家在一个小镇上,没有火车经过,所以她只能去邻近的城市坐火车(好可怜啊~)。 
[align=left]Input[/align]输入数据有多组,每组的第一行是三个整数T,S和D,表示有T条路,和草儿家相邻的城市的有S个,草儿想去的地方有D个;
接着有T行,每行有三个整数a,b,time,表示a,b城市之间的车程是time小时;(1=<(a,b)<=1000;a,b 之间可能有多条路)
接着的第T+1行有S个数,表示和草儿家相连的城市;
接着的第T+2行有D个数,表示草儿想去地方。 
[align=left]Output[/align]输出草儿能去某个喜欢的城市的最短时间。 
[align=left]Sample Input[/align]
6 2 3
1 3 5
1 4 7
2 8 12
3 8 4
4 9 12
9 10 2
1 2
8 9 10 
[align=left]Sample Output[/align]

[align=left]Author[/align]Grass 
[align=left]Source[/align]RPG专场练习赛 
注意建图,把草儿的家设为0这样解题就简单多了
#include<iostream>
#include<cstring>
#include<algorithm>
#include<cstdlib>
#include<vector>
#include<cmath>
#include<stdlib.h>
#include<iomanip>
#include<list>
#include<deque>
#include<map>
#include <stdio.h>
#include <queue>

#define maxn 10000+5
#define ull unsigned long long
#define ll long long
#define reP(i,n) for(i=1;i<=n;i++)
#define rep(i,n) for(i=0;i<n;i++)
#define cle(a) memset(a,0,sizeof(a))
#define mod 90001
#define PI 3.141592657

const ull inf = 1LL << 61;
const double eps=1e-5;
const int INF=999999;
using namespace std;

bool cmp(int a,int b){
return a>b;
}
int t,s,d;
int n;
int edge[1010][1010];
int lowcost[1010],vis[1010];
void Dj()
{
cle(vis);
vis[0]=1;
for(int i=0;i<=n;i++)
lowcost[i]=edge[0][i];
int Min,k;
while(1)
{
Min=INF;
for(int i=1;i<=n;i++)
if(!vis[i]&&lowcost[i]<Min)
{
Min=lowcost[i];k=i;
}
if(Min==INF)break;
vis[k]=1;
for(int j=1;j<=n;j++)
if(!vis[j]&&lowcost[k]+edge[k][j]<lowcost[j])
{
lowcost[j]=lowcost[k]+edge[k][j];
}
}
}
int main()
{
//freopen("in.txt","r",stdin);
//freopen("out.txt","w",stdout);
int a,b,c,f,e;
while(cin>>t>>s>>d)
{
for(int i=0;i<=1008;i++)
{
for(int j=0;j<=1008;j++)
edge[i][j]=INF;
edge[i][i]=0;
}
n=-1;
for(int i=1;i<=t;i++)
{
scanf("%d%d%d",&a,&b,&c);
if(c<edge[a][b])
{
edge[a][b]=c;
edge[b][a]=c;
}
n=max(n,max(a,b));
}
for(int i=1;i<=s;i++)
{
scanf("%d",&e);
edge[0][e]=0;
edge[e][0]=0;
}
Dj();
int Min=INF;
for(int i=1;i<=d;i++)
{
scanf("%d",&f);
Min=min(Min,lowcost[f]);
}
if(Min==INF)cout<<-1<<endl;
else cout<<Min<<endl;
}
return 0;
}

做一个平静的人。下面是优化的代码:
/* ***********************************************
Author :
Created Time :2015/8/3 13:25:12
File Name :1.cpp
************************************************ */
#include <iostream>
#include <cstring>
#include <cstdlib>
#include <stdio.h>
#include <algorithm>
#include <vector>
#include <queue>
#include <set>
#include <map>
#include <string>
#include <math.h>
#include <stdlib.h>
#include <iomanip>
#include <list>
#include <deque>
#include <stack>
#define ull unsigned long long
#define ll long long
#define mod 90001
#define INF 1<<30
#define maxn 1000+10
#define cle(a) memset(a,0,sizeof(a))
const ull inf = 1LL << 61;
const double eps=1e-5;
using namespace std;

bool cmp(int a,int b){
return a>b;
}
struct edge{
int u,v,w;
edge(int uu,int vv,int ww){
u=uu,v=vv,w=ww;
}
};
typedef pair<int,int>pii;
int lowcost[maxn];
int cnt;
void dij(int st,vector<edge>G[]){
priority_queue<pii>q;
for(int i=0;i<=cnt;i++)
lowcost[i]=(i==st?0:INF);
q.push(make_pair(lowcost[st],st));
while(!q.empty()){
pii u=q.top();
q.pop();
int x=u.second;
if(u.first!=lowcost[x])continue;
for(int i=0;i<G[x].size();i++){
int y=G[x][i].v;
int w=G[x][i].w;
if(lowcost[y]>lowcost[x]+w){
lowcost[y]=lowcost[x]+w;
q.push(make_pair(lowcost[y],y));
}
}
}
}
int main()
{
#ifndef ONLINE_JUDGE
freopen("in.txt","r",stdin);
#endif
//freopen("out.txt","w",stdout);
int t,s,d;
int x,y,z;
int ed;
while(cin>>t>>s>>d){
int Max=-INF;
vector<edge>G[maxn];
for(int i=1;i<=t;i++){
scanf("%d%d%d",&x,&y,&z);
edge E1(x,y,z);
edge E2(y,x,z);
G[x].push_back(E1);
G[y].push_back(E2);
Max=max(Max,max(x,y));
}
cnt=Max;
for(int i=1;i<=s;i++){
scanf("%d",&x);
edge E1(0,x,0);
edge E2(x,0,0);
G[0].push_back(E1);
G[x].push_back(E2);
}
dij(0,G);
int Min=INF;
for(int i=1;i<=d;i++){
scanf("%d",&ed);
Min=min(Min,lowcost[ed]);
}
printf("%d\n",Min);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: