晚餐jzyz1217 最短路(spfa)

描述 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;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

BIGBIGPPT

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值