1018 Public Bike Management

题目链接:https://pintia.cn/problem-sets/994805342720868352/problems/994805489282433024

找到所有的路径,比较自行车需要的数量,通过剪枝来减小工作量,下面是代码:

  1 #include <iostream>
  2 #include <vector>
  3 #include <algorithm>
  4 #include <stdio.h>
  5 #define INT_MAX 2147483647
  6 using namespace std;
  7 
  8 struct graph{
  9     int v1, v2;
 10     int e;
 11 };
 12 
 13 int C,N,S,M,k=0;
 14 vector<graph> a[501];//至少要是501 ,500最后一个测试点都通不过
 15 int co[501];
 16 int v[501]={0};
 17 int minc=INT_MAX;           //最小的站台数
 18 int sends=INT_MAX;          //
 19 int backs=INT_MAX;          //
 20 int path[501];
 21 int minp[501];
 22 
 23 void dfs(int b, int e, int c, int s, int r){
 24     if(c>minc)//剪枝,当前的权重已经大于最小权重
 25         return ;
 26     if(b==e){               //找到了目标点的位置,分不同情况进行更新
 27         if(c<minc){         //权重的优先级最高
 28             minc=c;
 29             backs=r;        //回来的个 数
 30             sends=s;        //送过去的个数
 31             for(int i=0;i<k;i++){   //将路径复制出来
 32                 minp[i]=path[i];
 33             }
 34         }else if(c==minc){      //目前的站台数等于最小站台数,不同路径是才这么比较
 35             if(s<sends){        //当前的需要配送的车辆小于记录中需要配送的车辆,更新,送出去的优先级其次
 36                 sends=s;
 37                 backs=r;
 38                 minc=c;
 39                 for(int i=0;i<k;i++){   //复制路径
 40                     minp[i]=path[i];
 41                 }
 42             }else if(s==sends){         //当前的需要送的车等于最小送的车,不同路径送出去的车一样就比较送回去的车
 43                 if(r<backs){            //回去的车辆小于当前记录中送回去的车辆,更新,最后的等级是送回去的车辆
 44                     sends=s;
 45                     backs=r;
 46                     minc=c;
 47                     for(int i=0;i<k;i++){   //复制路径
 48                         minp[i]=path[i];
 49                     }
 50                 }
 51             }
 52         }
 53         return ;
 54     }
 55     for(int i=0; i<a[b].size(); i++){
 56         if(v[a[b][i].v2]==0){
 57             v[a[b][i].v2]=1;
 58             path[k++]=a[b][i].v2;
 59             if(co[a[b][i].v2]<C/2){
 60                 if(r>=C/2-co[a[b][i].v2]){
 61                     dfs(a[b][i].v2,e,c+a[b][i].e,s,r-C/2+co[a[b][i].v2]);
 62                 }else{
 63                     dfs(a[b][i].v2,e,c+a[b][i].e,s+C/2-co[a[b][i].v2]-r,0);
 64                 }
 65             }else{
 66                 dfs(a[b][i].v2,e,c+a[b][i].e,s,r+co[a[b][i].v2]-C/2);
 67             }
 68             v[a[b][i].v2]=0;
 69             k--;
 70        }
 71     }
 72 }
 73 int main()
 74 {
 75 //    #ifdef ONLINE_JUDGE
 76 //    #else
 77 //    freopen("input.txt","r", stdin);
 78 //    #endif
 79     int i;
 80     cin>>C>>N>>S>>M;
 81 
 82     for(i=0;i<N;i++){
 83         int x;
 84         cin>>x;
 85         co[i+1]=x;
 86     }
 87     for(i=0;i<M;i++){
 88         graph g1,g2;
 89         cin>>g1.v1>>g1.v2>>g1.e;
 90         g2.v1=g1.v2;
 91         g2.v2=g1.v1;
 92         g2.e=g1.e;
 93         a[g1.v1].push_back(g1);
 94         a[g2.v1].push_back(g2);
 95     }
 96 
 97     dfs(0,S,0,0,0);
 98 
 99     cout<<sends<<" "<<"0";
100     for(i=0;i<501&&minp[i]!=S;i++){
101         cout<<"->"<<minp[i];
102     }
103     cout<<"->"<<S<<" "<<backs;
104 
105     return 0;
106 }

 

posted @ 2018-10-08 16:29  琥琥笙威  阅读(533)  评论(0编辑  收藏  举报