一个人的旅行Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 50553 Accepted Submission(s): 16807 Problem Description 虽然草儿是个路痴(就是在杭电待了一年多,居然还会在校园里迷路的人,汗~),但是草儿仍然很喜欢旅行,因为在旅途中 会遇见很多人(白马王子,^0^),很多事,还能丰富自己的阅历,还可以看美丽的风景……草儿想去很多地方,她想要去东京铁塔看夜景,去威尼斯看电影,去阳明山上看海芋,去纽约纯粹看雪景,去巴黎喝咖啡写信,去北京探望孟姜女……眼看寒假就快到了,这么一大段时间,可不能浪费啊,一定要给自己好好的放个假,可是也不能荒废了训练啊,所以草儿决定在要在最短的时间去一个自己想去的地方!因为草儿的家在一个小镇上,没有火车经过,所以她只能去邻近的城市坐火车(好可怜啊~)。
Input 输入数据有多组,每组的第一行是三个整数T,S和D,表示有T条路,和草儿家相邻的城市的有S个,草儿想去的地方有D个;
Output 输出草儿能去某个喜欢的城市的最短时间。
Sample Input 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
Sample Output 9
Author Grass
Source |
这题。。。。。,泪崩,各种错误都经历过,
嘿嘿嘿,
注意点:a,b 之间可能有多条路 这句话 贼坑,有可能 1 2 1然后 1 2 3他就变成了3,
防范措施:(当然有更好的欢迎在评论区分享下)
初始化: memset(map,0x3f3f3f3f,sizeof(map));
if(s[i].w<map[s[i].s][s[i].e]) 你只有比我小,才能进行赋值
{
map[s[i].s][s[i].e]=map[s[i].e][s[i].s]=s[i].w;
}
#include<iostream>
#include<string.h>
#include<algorithm>
#include<cstdio>
using namespace std;
int a[1001],map[1001][1001],low[1001],pre[1001],b[1001],c[1001],d[1001];
struct kk
{
int s,e,w;
}s[1001];
void DJS(int ve,int n)
{
bool v[1001];
int i,j;
for(i=1;i<=n;i++)
{
low[i]=map[ve][i];
v[i]=false;
if(low[i]==0x3f3f3f3f)
pre[i]=-1;
else
pre[i]=ve;
}
low[ve]=0;
v[ve]=true;
for(i=2;i<=n;i++)
{
int min=0x3f3f3f3f,pos=ve;
for(j=1;j<=n;j++)
{
if(!v[j]&&low[j]<min)
{
min=low[j];
pos=j;
}
}
v[pos]=true;
for(j=1;j<=n;j++)
{
if(!v[j]&&map[pos][j]<0x3f3f3f3f)
{
if(low[pos]+map[pos][j]<low[j])
{
low[j]=low[pos]+map[pos][j];
pre[j]=pos;
}
}
}
}
}
int main()
{
//freopen("1.txt","r",stdin);
int n,m,i,j,t=0,k,v0,ve;
while(~scanf("%d%d%d",&n,&m,&t))
{
k=0;
int max=0;
memset(map,0x3f3f3f3f,sizeof(map));
memset(s,0x3f3f3f3f,sizeof(s));
for(i=1;i<=n;i++)
{
scanf("%d%d%d",&s[i].s,&s[i].e,&s[i].w);
if(max<s[i].e)
max=s[i].e;
if(max<s[i].s)
max=s[i].s;
if(s[i].w<map[s[i].s][s[i].e])
{
map[s[i].s][s[i].e]=map[s[i].e][s[i].s]=s[i].w;
}
}
for(i=1;i<=m;i++)
{
scanf("%d",&b[i]);
}
for(i=1;i<=t;i++)
{
scanf("%d",&c[i]);
}
for(i=1;i<=t;i++)
{
DJS(c[i],max);
for(j=1;j<=m;j++)
{
d[k++]=low[b[j]];
//cout<<b[j]<<" "<<c[i]<<" "<<low[b[j]]<<endl;
}
}
sort(d,d+k);
//for(i=0;i<k;i++)
//cout<<d[i]<<" ";
//cout<<endl;
cout<<d[0]<<endl;
}
return 0;
}
Floyd算法; 关键是时间超限
#include<iostream>
#include<algorithm>
#include<string.h>
#include<cstdio>
#include<set>
using namespace std;
#define inf 0x3f3f3f3f
struct kk
{
int s,e,w;
} s[1005];
int map[1004][1004],a[1001],b[1001];
int Foyid(int n)
{
for(int k=1; k<=n; k++)
for(int i=1; i<=n; i++)
if(map[i][k]==inf) 就是这,节省时间
continue;
else
for(int j=1; j<=n; j++)
if(map[i][j]>map[i][k]+map[k][j])
map[i][j]=map[i][k]+map[k][j];
return 0;
}
int main()
{
int n,m,t,i,j;
set<int> q;
while(~scanf("%d%d%d",&n,&m,&t))
{
q.clear();
int max=0;
for(i=1;i<1001;i++)
for(j=1;j<1001;j++)
if(i==j)
map[i][j]=0;
else
map[i][j]=inf;
for(i=1; i<=n; i++)
{
scanf("%d%d%d",&s[i].s,&s[i].e,&s[i].w);
if(max<s[i].s)
max=s[i].s;
if(max<s[i].e)
max=s[i].e;
if(s[i].w<map[s[i].s][s[i].e])
map[s[i].s][s[i].e]=map[s[i].e][s[i].s]=s[i].w;
}
Foyid(max);
int mind=inf;
for(i=1; i<=m; i++)
scanf("%d",&a[i]);
for(i=1; i<=t; i++)
scanf("%d",&b[i]);
for(i=1; i<=m; i++)
{
for(j=1; j<=t; j++)
{
mind=min(mind,map[a[i]][b[j]]);
}
}
printf("%d\n",mind);
}
return 0;
}