题目:
链接:点击打开链接
题意:
思路:
对每个起点调用dij算法后,每个终点的最短路长度都已经出来了。对于每个起点,从这些终点的最短路中选出最最短路就可以了。 然后在比较每个终点,即求得最小值。
代码:
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
#define INF 100000000
const int N = 2000;
int t,s,d;
int a,b,time;
int map[N][N];
int from[N],to[N];
int dis[N];
int dijkstra(int a)
{
int vis[N];
int minn;
memset(vis,0,sizeof(vis));
for(int i=1; i<=N; i++)
{
dis[i] = map[a][i];
}
dis[a] = 0;
vis[a] = 1;
for(int i=1; i<N; i++)
{
int x;
minn = INF;
for(int y=1; y<N; y++)
{
if(!vis[y] && dis[y] < minn)
{
minn = dis[x=y];
}
}
vis[x] = 1;
if(minn == INF)
break;
for(int y=1; y<=N; y++)
{
if(!vis[y] && dis[y] > dis[x] + map[x][y])
dis[y] = dis[x] + map[x][y];
}
}
minn = INF;
for(int i=1; i<=d; i++)
{
if(minn > dis[to[i]])
{
minn = dis[to[i]];
}
}
return minn;
}
int main()
{
//freopen("input.txt","r",stdin);
while(scanf("%d%d%d",&t,&s,&d) != EOF)
{
for(int i=0; i<N; i++)
{
for(int j=0; j<=N; j++)
map[i][j] = INF;
}
for(int i=1; i<=t; i++)
{
scanf("%d%d%d",&a,&b,&time);
if(map[a][b] > time)
map[a][b] = map[b][a] = time;
}
for(int i=1; i<=s; i++)
scanf("%d",&from[i]);
for(int i=1; i<=d; i++)
scanf("%d",&to[i]);
int minTime = INF;
for(int i=1; i<=s; i++)
{
if(minTime > dijkstra(from[i]))
minTime = dijkstra(from[i]);
}
printf("%d\n",minTime);
}
return 0;
}
-----------------------------------------------------------
战斗,从不退缩;奋斗,永不停歇~~~~~~~~~~