1018.Public Bike Management

来源:互联网 发布:知乎 私募基金利润表 编辑:程序博客网 时间:2024/05/02 21:52
【题意】
        对公共自行车的分布进行调整,选取到达指定需要调整的点距离最短、派出车最少、收回车最少的路径(优先级依次降低)

【思路】
        先Dijkstra算出最短距离,然后DFS找出所有最短路径中派出车最少、返回车最少的路径。


#include <iostream>#include <vector>#include <cstring>#include <stack>using namespace std;#define MAXIMUM 0x00ffffffvector<int> stations,dist;vector<bool> visited;vector<vector<int>> weight;stack<int> path;int minSend = MAXIMUM,minReceive = MAXIMUM;int cmax,n,sp,m;bool dfs(int index, int remain, int maxSend){remain += stations[index]-cmax/2;if(remain<0){maxSend -= remain;remain = 0;}if(index==sp){if(maxSend<minSend || (maxSend==minSend && remain<minReceive)){minSend = maxSend;minReceive = remain;while(!path.empty()){path.pop();}path.push(index);return true;}return false;}else{bool flag = false;for(int i=1; i<=n; i++){if(dist[index]+weight[index][i]==dist[i]){if(dfs(i,remain,maxSend)){path.push(index);flag = true;}}}return flag;}}int main(int argc, char const *argv[]){cin >> cmax >> n >> sp >> m;stations.resize(n+1);dist.assign(n+1,MAXIMUM);visited.assign(n+1,false);weight.resize(n+1);for(int i=0; i<n+1; i++){weight[i].assign(n+1,MAXIMUM);}for(int i=1; i<=n; i++){cin >> stations[i];}for(int i=0; i<m; i++){int si,sj;cin >> si >> sj;cin >> weight[si][sj];weight[sj][si] = weight[si][sj];}//Dijkstravisited[0] = 1;dist[0] = 0;int index = 0;for(int i=0; i<n; i++){int min = MAXIMUM;int nextIndex;for(int j=1; j<=n; j++){if(!visited[j]){if(dist[index]+weight[index][j]<dist[j]){dist[j] = dist[index]+weight[index][j];}if(dist[j]<min){min = dist[j];nextIndex = j;}}}if(min==MAXIMUM){break;}index = nextIndex;visited[index] = 1;}stations[0] = cmax/2;dfs(0,0,0);cout << minSend << " ";bool first = true;while(!path.empty()){if(first){first = false;}else{cout << "->";}cout << path.top();path.pop();}cout << " " << minReceive;system("pause");return 0;}




0 0
原创粉丝点击