Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
5 8 5 1 2 2 1 5 3 1 3 4 2 4 7 2 5 6 2 3 5 3 5 1 4 5 1 2 2 3 4 3 4 1 2 3 1 3 4 2 3 2 1 1
1 -1
#include<stdio.h>
#include<string.h>
#define INF 1<<26
const int N = 1e3 + 10;
int w[N][N], d[N];
void Dijkstra(int n, int u)
{
int vis[N], i;
memset(vis, 0, sizeof(vis));
for(i = 0; i <= n; i++)
d[i] = INF;
d[u] = 0;
for(i = 0; i <= n; i++)
{
int x = u, temp = INF;
for(int y = 0; y <= n; y++)
if(!vis[y] && d[y] < temp)
temp = d[x = y];
if(temp == INF) break;
vis[x] = 1;
for(int y = 0; y <= n; y++)
if(d[y] > d[x] + w[x][y])
d[y] = d[x]+ w[x][y];
}
}
int main()
{
int n, m, des, i, j;
while(~scanf("%d%d%d",&n, &m, &des))
{
for(i = 0; i <= n; i++)
for(j = 0; j <= n; j++)
{
if(i == j)
w[i][j] = 0;
else
w[i][j] = INF;
}
int a, b, c;
for(i = 0; i < m; i++)
{
scanf("%d%d%d",&a, &b, &c);
if(c < w[a][b])
w[a][b] = c;
//两个车站之间如果有多条路,选择最短的一条
}
int num, p;
scanf("%d",&num);
for(i = 0; i < num; i++)
{
scanf("%d",&p);
w[0][p] = 0;
//自己加一个起点,把图更新
}
Dijkstra(n, 0);
if(d[des] < INF)
printf("%d\n",d[des]);
else
printf("-1\n");
}
return 0;
}#include<stdio.h>
#include<string.h>
#define INF 1<<26
const int N = 1e3 + 10;
int w[N][N], d[N];
void Dijkstra(int n, int u)
{
int vis[N], i;
memset(vis, 0, sizeof(vis));
for(i = 1; i <= n; i++)
d[i] = INF;
d[u] = 0;
for(i = 1; i <= n; i++)
{
int x = u, temp = INF;
for(int y = 1; y <= n; y++)
if(!vis[y] && d[y] < temp)
temp = d[x = y];
if(temp == INF) break;
vis[x] = 1;
for(int y = 1; y <= n; y++)
if(d[y] > d[x] + w[x][y])
d[y] = d[x] + w[x][y];
}
}
int main()
{
int n, m, des, i, j;
while(~scanf("%d%d%d",&n, &m, &des))
{
for(i = 1; i <= n; i++)
for(j = 1; j <= n; j++)
{
if(i == j)
w[i][j] = 0;
else
w[i][j] = INF;
}
int a, b, c;
for(i = 0; i < m; i++)
{
scanf("%d%d%d",&a, &b,&c);
if(c < w[b][a])
w[b][a] = c;
//路也反向
}
Dijkstra(n, des); //终点作为起点
int num, Min_path = INF, p;
scanf("%d",&num);
for(i = 0; i < num; i++)
{
scanf("%d",&p);
if(d[p] < Min_path)
Min_path = d[p]; //记录最小值
}
if(Min_path < INF)
printf("%d\n",Min_path);
else
printf("-1\n");
}
return 0;
}hdu2680 Choose the best route 最短路(Dijkstra算法)
原文:http://blog.csdn.net/lyhvoyage/article/details/19190585