hdu2680
来源:互联网 发布:淘宝买家申请售后时间 编辑:程序博客网 时间:2024/04/27 22:15
设置虚拟的点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(); }}