设置虚拟的点0,让他与所有的起点相连距离为0 就相当与从0点出发 找最短路;
#include <iostream>
#include <cstdio>
#include <cstring>
#include <queue>
using namespace std;
const int _max = 0x3f3f3f3f;
const int maxn = 1000+10;
int map[maxn][maxn];
bool visit[maxn];
int dist[maxn];
int n, m, des;
void SPFA()
{
queue<int>q;
for(int i = 0; i <= n; i++)
dist[i] = _max;
dist[0] = 0;
visit[0] = true;
q.push(0);
while(!q.empty())
{
int cur = q.front();
q.pop();
visit[cur] = false;
for(int i = 0; i <= n; i++)
if(dist[i]>dist[cur]+map[cur][i])
{
dist[i] = dist[cur]+map[cur][i];
if(!visit[i])
{
q.push(i);
visit[i] = true;
}
}
}
if(dist[des]<_max)
printf("%d\n", dist[des]);
else printf("-1\n");
}
int main()
{
while(scanf("%d%d%d", &n, &m, &des)!=EOF)
{
for(int i = 0; i <= n; i++)
for(int j = 0; j <= n; j++)
map[i][j] = _max;
for(int i = 1; i <= m; i++)
{
int u, v, w;
scanf("%d%d%d", &u, &v, &w);
if(map[u][v] > w) map[u][v] = w;
}
int f;
scanf("%d", &f);
for(int i = 1; i <= f; i++)
{
int v;
scanf("%d", &v);
map[0][v] = 0;
}
memset(visit, false, sizeof(visit));
SPFA();
}
}
hdu2680
最新推荐文章于 2021-07-29 18:44:16 发布