75 分求助
查看原帖
75 分求助
793625
Pink_Cut_Tree楼主2024/8/6 19:56

Dijkstra

#include<bits/stdc++.h>
using namespace std;
const int N=1005,inf=2e9;
#define pii pair<int,int>
#define int long long
int s,t,n;
int cost,len;
int city[N];
struct Edge{
	int to,value,pay;
};
vector<Edge>G[N];
int money[N],dis[N];
bool vis[N];
priority_queue<pii,vector<pii>,greater<pii> >Q;
signed main(){
	cin.tie(0)->sync_with_stdio(0);
	cin>>s>>t>>n;
	for(int i=1;i<=n;i++){
		cin>>cost>>len;
		for(int j=1;j<=len;j++){
			cin>>city[j];
		}
		for(int j=1;j<=len;j++){
			for(int k=j+1;k<=len;k++){
				G[city[j]].push_back({city[k],k-j,cost});
			}
		}
	}
	for(int i=1;i<=1000;i++){
		dis[i]=money[i]=inf;
	}
	dis[s]=money[s]=0;
	Q.push({0,s});
	while(!Q.empty()){
		int u=Q.top().second; Q.pop();
		if(vis[u]){
			continue;
		}
		vis[u]=1;
		for(int i=0;i<G[u].size();i++){
			int v=G[u][i].to,w=G[u][i].value,c=G[u][i].pay;
			if(money[v]>money[u]+c){
				dis[v]=dis[u]+w;
				money[v]=money[u]+c;
				Q.push({dis[v],v});
			}
			if(money[v]==money[u]+w&&dis[v]>dis[u]+c){
				dis[v]=dis[u]+c;
				Q.push({dis[v],v});
			}
		}
	}
	if(dis[t]==inf){
		cout<<"-1 -1";
	}
	else{
		cout<<money[t]<<" "<<dis[t];
	}
return 0;
}
2024/8/6 19:56
加载中...