Jogging(icpc)

首先吐槽这次比赛题目描述真的太冗长了 单说这个题目还是很好的(尽管很简单)

首先不难想到最短路 肯定是从靠近源点到远离源点的顺序去走

每次走的下限可以不管 因为可以在一条路上来回走

因为要求每天多走一条新边 所以我们考虑每条边

如果这条边的其中一点乘2(保证来回)小于上限 那么肯定就有多的步伐走这条边

#include<bits/stdc++.h>
using namespace std;
#define lowbit(x) x&(-x)
#define ll long long
int n,m,L,R,cnt;
const int maxn=1e5+5;
int head[maxn],dp[maxn],vis[maxn];
struct ed{
	int u,to,next,w;
}edg[maxn<<1];
void add(int u,int v,int w){
	edg[++cnt].next=head[u];head[u]=cnt;edg[cnt].to=v;edg[cnt].u=u;edg[cnt].w=w;
}
void spfa();
int main(){
	cin>>n>>m>>L>>R;
    for(int i=1;i<=m;i++){
    	int aa,bb,cc;
    	cin>>aa>>bb>>cc;
    	add(aa,bb,cc);
    	add(bb,aa,cc);
	}
	spfa();
	int ans=0;
	for(int i=1;i<=cnt;i++){
		int u=edg[i].u,v=edg[i].to;
		if((min(dp[u],dp[v])*2)<R)
		ans++;
	}
	cout<<ans/2;
	return 0;
}
void spfa(){
	queue<int>Q;
	memset(dp,0x7f,sizeof(dp));
	vis[0]=1;dp[0]=0;
	Q.push(0);
	while(!Q.empty()){
		int u=Q.front();
		Q.pop();
		vis[u]=0;
		for(int i=head[u];i;i=edg[i].next){
		int to=edg[i].to,w=edg[i].w;
		if(dp[to]>dp[u]+w){
			dp[to]=dp[u]+w;
			if(!vis[to])vis[to]=1,Q.push(to);
		}
		} 
		}
	}
posted @   wzx_believer  阅读(69)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】
点击右上角即可分享
微信分享提示