比较简单,加个超级源点就是最普通的最短路了。 004452552010-07-02 12:46:03Accepted1009250 MS4224 KBVisual C++Slave_wc #include <iostream> #include <cstring> #include <cstdio> #include <queue> using namespace std; #define INF 0x3fffffff #define MAXN 1010 int map[MAXN][MAXN]; int dis[MAXN]; bool hash[MAXN]; struct Dij { int id; int dis; bool friend operator < (const Dij a, const Dij b) { return a.dis > b.dis; } }; Dij now, next; void Init(int n) { for (int i = 0; i <= n; i++) { map[i][i] = 0; for (int j = i + 1; j <= n; j++) { map[i][j] = map[j][i] = INF; } } } int Bfs(int st, int ed, int n) { memset(hash, false, sizeof(hash)); for (int i = 0; i <= n; i++) { dis[i] = INF; } priority_queue<Dij> Q; now.id = st; now.dis = 0; dis[st] = 0; Q.push(now); while (!Q.empty()) { now = Q.top(); Q.pop(); if (hash[now.id]) { continue; } if (now.id == ed) { return now.dis; } hash[now.id] = true; for (int j = 0; j <= n; j++) { if (!hash[j] && dis[j] > dis[now.id] + map[now.id][j]) { dis[j] = dis[now.id] + map[now.id][j]; next.id = j; next.dis = dis[j]; Q.push(next); } } } return -1; } int main() { int n, m, ed, p, q, t, num, near; while (scanf("%d %d %d", &n, &m, &ed) != EOF) { Init(n); while (m--) { scanf("%d %d %d", &p, &q, &t); if (t < map[p][q]) { map[p][q] = t; } } scanf("%d", &num); while (num--) { scanf("%d", &near); map[0][near] = 0; } int ans = Bfs(0, ed, n); printf("%d/n", ans); } return 0; }