题目:
链接:点击打开链接
题意:
思路:
自己加一个虚拟源点,把起点集合中的点连接到虚拟点上,并将路径长度设为0,就构成了一个由n+1个点组成的单源最短路算法。
代码:
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
#define INF 100000000
const int N = 1010;
int n,m,s;
int map[N][N],dis[N];
int dijkstra(int v)
{
int vis[N];
memset(vis,0,sizeof(vis));
for(int i=1; i<=n; i++)
dis[i] = map[v][i];
dis[v] = 0;
for(int i=1; i<n; i++)
{
int x,minn = INF;
for(int y=1; y<=n; y++)
{
if(!vis[y] && minn > dis[y])
minn = dis[x=y];
}
vis[x] = 1;
if(minn == INF)
break;
for(int y=1; y<=n; y++)
{
if(dis[y] > dis[x] + map[x][y])
dis[y] = dis[x] + map[x][y];
}
}
return dis[s];
}
int main()
{
//freopen("input.txt","r",stdin);
int p,q,t,to;
int w;
while(scanf("%d%d%d",&n,&m,&s) != EOF)
{
for(int i=0; i<=n; i++)
{
for(int j=0; j<=n; j++)
map[i][j] = INF;
}
for(int i=1; i<=m; i++)
{
scanf("%d%d%d",&p,&q,&t);
if(map[p][q] > t)
map[p][q] = t;
}
scanf("%d",&w);
for(int i=1; i<=w; i++)//设立虚拟点
{
scanf("%d",&to);
map[0][to] = 0;
}
printf("%d\n",dijkstra(0) == INF ? -1 : dijkstra(0));
}
return 0;
}
----------------------------------------------------------------------
战斗,从不退缩;奋斗,永不停歇~~~~~~~~~~~~~