链接:https://cn.vjudge.net/problem/POJ-2387
题意: 大约就是 一个people1 想多睡美容觉, 所以要尽快从顶点N 回到 顶点1,保证在people2叫醒他之前多睡点会。 然而people1 是个路痴, 但每个顶点之间有多条双向的牛的轨迹, 所以他可以通过这个回到顶点1。
所以该题 就是求N到1的最短路径。
只不过要注意的是 在输入中 两个顶点之间可能有条边 所以你再输入时只保存最短的那一条边。
#include <iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#define INF 0x3f3f3f
using namespace std;
int G[2111][2111];//邻接矩阵
int N,T, i, j, k;
void Dijkstra(int s, int v)// 未优化的dijkstra
{
int dis[2111];//
for(i = 1; i<= N; i++)dis[i] = G[s][i]; //初始化
dis[s] = 0;
int book[2111];
memset(book, 0, sizeof(book));
book[s] =1; //将自己标记
for(i = 1; i< N; i++)//N次循环
{
int Min= INF;//最近的距离
int u = -1; //最近的下标
for(j = 1; j <=N; j++) //找最近的
{
if(!book[j]&& dis[j]< Min)
{
u = j;
Min = dis[j];
}
}
if(u == -1)break;//结束标志
book[u] = 1;
for(j = 1; j <= N; j++)
{
if(dis[j]!=INF&&dis[u]+G[u][j] < dis[j])
{
dis[j] = dis[u]+G[u][j];
}
}
}
printf("%d\n", dis[v]);
}
int main()
{
while(~scanf("%d %d", &T, &N)){
//初始化图
memset(G, INF, sizeof(G));
for(i = 1; i <= N; i++)G[i][i] = 0;
for(i = 1; i<= T; i++)
{
int u, v, w;
scanf("%d %d %d", &u, &v, &w);
if(w < G[u][v]) G[u][v] = G[v][u]= w;//保存最短的那一条边
}
Dijkstra(N, 1);
}
return 0;
}