首页 > 代码库 > 最短路径
最短路径
一个人的旅途
Input
接着有T行,每行有三个整数a,b,time,表示a,b城市之间的车程是time小时;(1=<(a,b)<=1000;a,b 之间可能有多条路)
接着的第T+1行有S个数,表示和草儿家相连的城市;
接着的第T+2行有D个数,表示草儿想去地方。
Output
Sample Input
6 2 31 3 51 4 72 8 123 8 44 9 129 10 21 28 9 10
Sample Output
9
我的代码;
#include<cstdio>
#include<iostream>
#include<string.h>
using namespace std;
const int maxnum=1005;
const int maxint=999999;
int dist[maxnum];
int prev[maxnum];
int c[maxnum][maxnum];
int Dijkstra(int n,int v)
{
bool s[maxnum];
for(int i=1;i<=n;i++)
{
dist[i]=c[v][i];
s[i]=0;
if(dist[i]==maxint)
{
prev[i]=0;
}
else
{
prev[i]=1;
}
}
dist[v]=0;
s[v]=1;
for(int i=2;i<=n;i++)
{
int temp,u;
temp=maxint;
u=v;
for(int j=1;j<=n;j++)
{
if(!s[j]&&dist[j]<temp)
{
u=j;
temp=dist[j];
}
}
s[u]=1;
for(int j=1;j<=n;j++)
{
if(!s[j]&&c[u][j]<maxint)
{
int newdist=dist[u]+c[u][j];
if(newdist<dist[j])
{
prev[j]=u;
dist[j]=newdist;
}
}
}
}
return 0;
}
int main()
{
int n,line,s,t;
int w[maxnum];
int z[maxnum];
int r[maxnum];
while(scanf("%d%d%d",&line,&s,&t)!=EOF)
{
int p,q,len;
for(int i=1;i<=maxnum;i++)
{
for(int j=1;j<=maxnum;j++)
{
c[i][j]=maxint;
}
c[i][i]=0;
}
memset(dist,0,sizeof(dist));
int max=0;
for(int i=1;i<=line;i++)
{
cin>>p>>q>>len;
if(p>max) max=p;
if(q>max) max=q;
if(len<c[p+1][q+1])
{
c[p+1][q+1]=len;
c[q+1][p+1]=len;
}
}
n=max;
for(int i=1;i<=n;i++)
{
dist[i]=maxint;
}
for(int i=1;i<=s;i++)
{
cin>>w[i];
}
for(int i=1;i<=t;i++)
{
cin>>z[i];
}
int k=1;
for(int i=1;i<=s;i++)
{
Dijkstra(n,w[i]);
for(int j=1;j<=t;j++)
{
r[k++]=dist[z[j]];
}
}
int min=maxint;
for(int i=1;i<=n;i++)
{
if(min>r[i])
min = r[i];
}
cout<<min<<endl;
}
return 0;
}
AC代码:
#include<stdio.h>
#include<string.h>
#define max 0x7fffffff
int visit[1005];
int dist[1005];
int prev[1005];
int map[1005][1005];
void dijkstra(int n,int v)
{
memset(dist,-1,sizeof(dist));
for(int i=1;i<=n;i++)
{
dist[i]=map[v][i];
visit[i]=0;
if(dist[i]==max)
prev[i]=0;
else
prev[i]=v;
}
visit[v]=1;
dist[v]=0;
for(int j=0;j<=n;j++)
{
int min=max;
int u;
for(int i=1;i<=n;i++)
{
if(dist[i]<min&&visit[i]==0)
{
min=dist[i];
u=i;
}
}
visit[u]=1;
for(int i=1;i<=n;i++)
{
if(map[u][i]!=max&&visit[i]==0)
{
int newdist=dist[u]+map[u][i];
if(newdist<dist[i])
{
dist[i]=newdist;
prev[i]=u;
}
}
}
}
}
int main()
{
int t,s,d;
int a,b,ss,v[1000],e[1000];
int distt[1000];
while(scanf("%d%d%d",&t,&s,&d)!=EOF)
{
//memset(map,-1,sizeof(map));
for(int i=1;i<1001;i++)
{
for(int j=1;j<1001;j++)
{
map[i][j]=max;
}
}
memset(distt,0,sizeof(distt));
int min=-1;
for(int i=0;i<t;i++)
{
scanf("%d%d%d",&a,&b,&ss);
if(map[a][b]>ss)//可能有多条路径,需判断找出最短的路径
map[a][b]=map[b][a]=ss;
if(a>min)
min=a;
if(b>min)
min=b;
}
for(int i=0;i<s;i++)
{
scanf("%d",&v[i]);
}
for(int i=0;i<d;i++)
{
scanf("%d",&e[i]);
}
int w=0;
//printf("min=%d\n",min);
for(int i=0;i<s;i++)
{
dijkstra(min,v[i]);
for(int j=0;j<d;j++)
{
distt[w++]=dist[e[j]];
}
}
int minn=max;
for(int i=0;i<w;i++)
{
//printf("%d ",distt[i]);
if(distt[i]<minn&&distt[i]>0)
minn=distt[i];
}
printf("%d\n",minn);
}
return 0;
}