8095: 小L的假期旅行 dijkstra

描述

 

在即将到来的五一假期,小L向爸爸妈妈申请了T元的经费,开始计划起了自己五一的假期旅行。小L家在1号城市,尽管假期并不算长,小L还是希望在T元经费内选择去其他城市旅行。算上小L自己所在的1号城市,小L列举了N个城市,而这N个城市里有一些城市之间有双向连通的路径,并且每条路径也有对应的费用(两个城市之间的路径可能不止一条)。现在给你共N个城市和M条路径和路径对应的费用,以及经费T,请你帮小L计算他有多少个城市可供选择

 

 

输入

 

第一行为3个整数N,M,T,代表N个城市,M条路径,T元经费(1<=N<=1000,0<=M<=min(n*(n-1),2000),1<=T<=10000)

接下来为M行,每行三个整数a,b,c,表示城市a和城市b之间有一条路径连通,费用为c元

(1<=a,b<=N,1<=c<=10000)

 

 

输出

 

一个整数,即小L的T元最多能到达的城市个数

 

 

样例输入

 

样例输出

 

提示

小L的10元经费最多可以到达2,5,6这3个城市

复制代码
#include<bits/stdc++.h>
using namespace std;
const int inf = 0x3f3f3f3f;
int g[2005][2005],vis[2005],dis[2005];
int n,m,t;
void dij(int s)
{
    for(int i=1;i<=n;i++)dis[i] = g[s][i];
    dis[s] = 0;vis[s] = 1;
    int minn,pos;
    for(int i=1;i<=n;i++)
    {
        minn = inf;
        for(int j=1;j<=n;j++)
        {
            if(vis[j]==0&&dis[j]<minn)
            {
                minn = dis[j];pos = j;
            }
        }
        if(minn==inf)break;
        vis[pos] = 1;
        for(int j=1;j<=n;j++)
        {
            if(dis[j]>dis[pos]+g[pos][j])
                dis[j] = dis[pos]+g[pos][j];
        }
    }
}
int main()
{
    freopen("travel.in","r",stdin);
    freopen("travel.out","w",stdout);
    cin>>n>>m>>t;
    memset(g,inf,sizeof(g));
    for(int i=1;i<=n;i++)g[i][i] = 0;
    for(int i=1;i<=m;i++)
    {
        int x,y,z; cin>>x>>y>>z;
        if(z<g[x][y])g[x][y] = g[y][x] = z;
    }
    dij(1);
    int sum = 0;
    for(int i=2;i<=n;i++)
        if(dis[i]<=t)sum++;
    cout<<sum;
     return 0;
}
复制代码

 

posted @   CRt0729  阅读(68)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示