PAT-1018(Public Bike Management)最短路+额外条件+所有最短路中找出满足条件的路径+dijkstra算法

Public Bike Management

PAT-1018

  • 使用一个vector来存储所有最短路的前驱结点,再通过使用dfs和一个额外的vector记录每一条路径
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<string>
#include<cmath>
#include<queue> 
using namespace std;
const int maxn=502;
const int maxm=250004;
const int INF=0X3F3F3F3F;
int cmax,n,m,pi; 
int ci[maxn];
int head[maxn];
int top;
int d[maxn];
vector<int>pre[maxn];//记录路径也就是前驱结点 
int minneed=INF,minback=INF; 
int temp;//当前收集了多少单车数量 
vector<int>tempve;
vector<int>path;//真正符合题意的路径 
struct Edge{
	int to,cost,next;
};
Edge edge[maxm];
struct Node{
	int to,dis;
	Node(){
	}
	Node(int a,int b):to(a),dis(b){
	}
	bool operator<(const Node& node)const{
		return dis>node.dis;//从大到小排序,越小的元素优先级越高 
	}
};
void dijkstra(int s){
	priority_queue<Node>que;
	que.push(Node(s,0));
	for(int i=0;i<=n;i++){
		d[i]=INF;
	}
	d[s]=0;
	while(!que.empty()){
		Node now=que.top();
		que.pop();
		int to=now.to;
		int dis=now.dis;
		if(d[to]<dis)
			continue;
		for(int i=head[to];i!=-1;i=edge[i].next){
			Edge e=edge[i];
			if(d[e.to]>d[to]+e.cost){
				d[e.to]=d[to]+e.cost;
				que.push(Node(e.to,d[e.to]));
				pre[e.to].clear(); 
				pre[e.to].push_back(to); 
			}else if(d[e.to]==d[to]+e.cost){
//				que.push(Node(e.to,d[e.to]));
				pre[e.to].push_back(to);
			}
		}
	}
}
void dfs(int v){
	if(v==0){//调度中心 
		tempve.push_back(v);
		int takefrom=0,takeback=0;
		for(int i=tempve.size()-1;i>=0;i--){//从起点开始遍历 
			int id=tempve[i];
//			cout<<id<<" ";
			if(ci[id]>0){//ci[id]>5
				takeback+=ci[id];
			} else{
				if(takeback>-ci[id]){
					takeback+=ci[id];
				}else{
					takefrom+=(-ci[id]-takeback);//缺失的比需要带回的更多 
					takeback=0;
				}
			}
		}
//		cout<<endl;
		if(takefrom<minneed){
			minneed=takefrom,minback=takeback,path=tempve;
		}else if(takefrom==minneed&&takeback<minback){
			minback=takeback,path=tempve;
		}
		tempve.pop_back();
		return;
	}
	tempve.push_back(v);
	for(int i=0;i<pre[v].size();i++){
		dfs(pre[v][i]);
	}
	tempve.pop_back(); 
}
void addEdge(int a,int b,int c){
	edge[top].to=b;
	edge[top].cost=c;
	edge[top].next=head[a];
	head[a]=top++;
}
int main(){
	top=0;
	memset(head,-1,sizeof(head));
	cin>>cmax>>n>>pi>>m;
	for(int i=1;i<=n;i++){
		cin>>ci[i];
		ci[i]-=cmax/2;
	}
	for(int i=0;i<m;i++){
		int a,b,c;
		cin>>a>>b>>c;
		addEdge(a,b,c);
		addEdge(b,a,c);
	}
	dijkstra(0);
	dfs(pi);
	reverse(path.begin(),path.end());
	cout<<minneed<<" ";
	for(int i=0;i<path.size();i++){
		if(i==(int)path.size()-1){
			cout<<path[i]<<" ";
		}else cout<<path[i]<<"->";
	}
	cout<<minback<<endl;
	return 0;
} 
posted @ 2020-09-23 10:17  Garrett_Wale  阅读(100)  评论(0编辑  收藏  举报