#19WA求调
查看原帖
#19WA求调
1108881
LS_QYY楼主2025/8/28 22:53
#include<bits/stdc++.h>
using namespace std;
const int N=100005;
int n,s,l,r,f[N];
vector<pair<int,int>> vec[N];
set<pair<int,int>> st;
void dijkstra(){
	priority_queue< pair<int,int>,vector<pair<int,int>>,greater<pair<int,int>> > pq;
	bool vis[N]={}; memset(f,0x3f,sizeof(f));
	pq.push({0,0}); f[0]=0;
	while(!pq.empty()){
		int n1=pq.top().first,n2=pq.top().second;  pq.pop();
		if(vis[n1]) continue; vis[n1]=1;
		for(int i=0;i<vec[n1].size();i++){
			int nx1=vec[n1][i].first,nx2=vec[n1][i].second;
			if(f[n1]+nx2<f[nx1]){
				f[nx1]=f[n1]+nx2;
				pq.push({nx1,f[nx1]});
			}
		}
	}
}
int main(){
	cin>>n>>s>>l>>r;
	for(int i=1;i<=s;i++){
		int u,v,w; cin>>u>>v>>w;
		vec[u].push_back({v,w});
		vec[v].push_back({u,w});
	}
	dijkstra();
	int ans=0;
	for(int i=0;i<=n-1;i++){
		for(int j=0;j<vec[i].size();j++){//枚举边 
			int k=vec[i][j].first;//该条边的目的地 
			if(st.count({i,k})) continue;
			if(min(f[i],f[k])*2<r){
				ans++;
				st.insert({i,k});
				st.insert({k,i});
			}
		}
	}
	cout<<ans<<endl;
	return 0;
}

大致思路是用dijkstra跑出起点到每个点的最短路,随后枚举每条边判断是否能在规定的总路程之内往返

使用了一个set筛去已经判断完的边

2025/8/28 22:53
加载中...