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 }