版权声明:本博客版权属于BIGBIGPPT,未经允许不得商用 https://blog.csdn.net/BIGBIGPPT/article/details/87915483
描述 Description
Bessie喜欢为在外面的奶牛做晚餐,Bessie按响铃给他们一个信号叫他们进来就可以了。
晚餐将在T (1 <= T <= 1,000,000)毫秒完成,而且Bessie强调那些想吃她晚餐的奶牛必须准时到。
这些牛在F (1 <= F <= 500)各不同的草地标号为1~F用P(1 <= P <= 10,000)个双向的小路连接。Bessie在第1个草地, 给出一头牛走每一条小路所用的时间,问多少个草地上的奶牛可以在T毫秒内到Bessie 所在的草地,假设多头牛可以共享一条路。
输入格式 Input Format
第一行:三个整数用空格隔开,T,F,P
第2~P+1 行,每行表示在两个草地间的一条路,给出三个用空格隔开的整数,分别表示,
这条路所连接的一个草地和另一个草地以及奶牛走这条路所需要的毫秒数(1…1,000,000)
输出格式 Output Format
一行,可以在T毫秒内到达Bessie所在的位置草地的个数
样例输入 Sample Input
1000 5 6
1 2 300
2 4 200
3 4 600
3 4 800
5 3 100
2 5 650
样例输出 Sample Output
4
这道题就是一个最短路裸题,找起点1到其他点的最短路;
dijkstra 和 spfa 都行;
t是 <= 100,000 保险的我开了long long
最后遍历一遍dis数组小于t就把答案++,最后输出答案就行了;
写的时候spfa的vis[]true和false我打错了竟然还过了60分。
让我好找了半天QAQ
#include<bits/stdc++.h>
#define ll long long
#define MAXN 100010
#define INF 0x3f3f3f3f
using namespace std;
struct node{
int x,y,ne,z;
}e[MAXN];
int lin[MAXN],len = 0;
inline void addedge(int x,int y, int z){
e[++len].x = x;e[len].y = y;e[len].z = z;
e[len].ne = lin[x];lin[x] = len;
}
ll t,n,m,dis[MAXN];
int vis[MAXN];
void spfa(int s){
queue < int > q;
q.push(s); dis[s] = 0; vis[s] = true;
while(!q.empty()){
int x = q.front();q.pop();vis[x] = false;
for(int i = lin[x] ; i ; i = e[i].ne){
int y = e[i].y, z = e[i].z;
if(dis[y] > dis[x] + z){
dis[y] = dis[x] + z;
if(!vis[y]){
vis[y] = true;
q.push(y);
}
}
}
}
}
int main()
{
// freopen("input.in","r",stdin);
// freopen("output.out","w",stdout);
memset(vis,false,sizeof(vis));
memset(dis,INF,sizeof(dis));
scanf("%d%d%d",&t,&n,&m);
for(int i = 1; i <= m; ++i){
ll a,b,c;
scanf("%d%d%d",&a,&b,&c);
addedge(a,b,c);
addedge(b,a,c);
}
spfa(1);
ll ans = 0;
for(int i = 1; i <= n; ++i){
if(dis[i] <= t)
ans++;
}
printf("%lld\n",ans);
return 0;
}