POJ2387 ————最短路

本博客主要介绍了POJ2387题目,内容涉及求解从顶点N到顶点1的最短路径问题。在问题背景中,people1试图在people2叫醒他之前尽快返回顶点1,而每两个顶点间存在多条双向牛的轨迹。关键在于处理输入时只保留最短的边,最终目的是找到从N到1的最短路径。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

链接: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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值