求调,dijkstra求同余最短路,没过样例
查看原帖
求调,dijkstra求同余最短路,没过样例
1258467
hao12345ia楼主2025/2/8 13:55
#include<bits/stdc++.h>
using namespace std;
struct edge{
  long long v, w;
};
struct s_to_i{
  long long dis,u;
  bool operator>(const s_to_i& a)const{ 
    return dis>a.dis;
    }
};
int a[13];
priority_queue<s_to_i, vector<s_to_i>, greater<s_to_i> > q;
vector<edge> e[100001];
long long dis[100001], vis[100001];
void dijkstra( int s) {
    memset(dis,0x3f3f3f,sizeof(dis));
  dis[s]=0;
  q.push({0,s});
  while(!q.empty()){
    long long u=q.top().u;
    q.pop();
    if(vis[u]) {
        continue;
    }
    vis[u]=1;
    for(auto ed:e[u]) {
      long long v=ed.v,w=ed.w;
      if (dis[v]>dis[u]+w) {
        dis[v]=dis[u]+w;
        s_to_i disi;
        disi.u=v;
        disi.dis=dis[u]+w;
        q.push(disi);
      }
    }
  }
//  for(int i=1;i<=a[1];i++){
//    cout<<dis[i]<<" ";
//  }
}
int main(){
	long long n,l,r,cnt;
	cin>>n>>l>>r;
	for(int i=1;i<=n;i++){
		cin>>a[i];
	}
	sort(a+1,a+1+n);
	int t=a[1];
	for(long long i=0;i<t;i++){
		for(int j=2;j<=n;j++){
			e[i].push_back({a[j],(i+a[j])%t});
		}
	}
	dijkstra(0);
	long long ans;
	for(int i=0;i<t;i++){
		if(r>=dis[i]){
			ans+=(r-dis[i])/t+1;
		}
		if(l>dis[i]){
			ans-=(l-1-dis[i])/t+1;
		}
	}
	cout<<ans;
}
2025/2/8 13:55
加载中...