HDU 2680 最短路

#include <cstring>
#include <cstdio>
#include <algorithm>
using namespace std;
const int INF = 0x3f3f3f3f;
const int maxn = 1010;
int num, road, dest, mp[maxn][maxn], dis[maxn], x, y, cost, tmp, cnt;
bool vis[maxn];
void Dijkstra()
{
	memset(vis, 0, sizeof(vis));
	for (int i = 0; i <= num; i++)
		dis[i] = mp[0][i];
	dis[0] = 0, vis[0] = 1;
	for (int i = 0; i <= num; i++)
	{
		int temp = INF, k;
		for (int j = 0; j <= num; j++)
			if (!vis[j] && temp > dis[j])
				temp = dis[k = j];
		if (temp == INF) break;
		vis[k] = 1;
		for (int j = 0; j <= num; j++)
			if (!vis[j] && dis[j] > dis[k] + mp[k][j])
				dis[j] = dis[k] + mp[k][j];
	}
}
int main(int argc, char const *argv[])
{
	while (~scanf("%d%d%d", &num, &road, &dest))
	{
		memset(mp, INF, sizeof(mp));
		for (int i = 1; i <= road; i++)
		{
			scanf("%d%d%d", &x, &y, &cost);
			if (cost < mp[x][y]) mp[x][y] = cost;
		}
		scanf("%d", &cnt);
		for (int i = 0; i < cnt; i++)
		{
			scanf("%d", &tmp);
			mp[0][tmp] = 0;
		}
		Dijkstra();
		if (dis[dest] == INF) printf("-1\n");
		else printf("%d\n", dis[dest]);
	}
	return 0;
}


多个起点的最短路,设设一个超级源点,到所有起点的距离为0,算法从超级源点开始跑。

你可能感兴趣的:(HDU 2680 最短路)