描述
在即将到来的五一假期,小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; }
标签:8095,假期,城市,路径,pos,int,dijkstra,2005 From: https://www.cnblogs.com/jyssh/p/17363565.html