☆1018
先写主体结构,后填充,如果是主体结构错了,是很难发现的
二维数组的fill填充
1 #include <cstdio> 2 #include <vector> 3 #include <algorithm> 4 using namespace std; 5 const int Maxv = 510; 6 const int INF = 0x3fffffff; 7 int Cmax, N, Sp, M; 8 int perfect; 9 vector<int> pre[Maxv]; 10 bool vis[Maxv]= {false}; 11 int dis[Maxv]; 12 int bikes[Maxv]; 13 int Mgraph[Maxv][Maxv]; 14 vector<int>tmppath; 15 vector<int>path; 16 int minneed=INF, minremain=INF; 17 void dijkstra(int s) 18 { 19 fill(dis,dis+Maxv,INF); 20 dis[s]=0; 21 for(int i=0; i<=N; i++) 22 { 23 int u=-1, MIN=INF; 24 for(int j=0; j<=N; j++) 25 { 26 if(dis[j]<MIN&&vis[j]==false) 27 { 28 MIN=dis[j]; 29 u=j; 30 } 31 } 32 if(u==-1)return; 33 vis[u]=true; 34 for(int v=0; v<=N; v++) 35 { 36 if(vis[v]==false&&Mgraph[u][v]!=INF) 37 { 38 int weight=Mgraph[u][v]; 39 if(weight+dis[u]<dis[v]) 40 { 41 dis[v]=weight+dis[u]; 42 pre[v].clear(); 43 pre[v].push_back(u); 44 } 45 else if(weight+dis[u]==dis[v]) 46 { 47 pre[v].push_back(u); 48 } 49 } 50 } 51 52 } 53 54 } 55 56 57 void caculatethedemand(int vertex){ 58 if(vertex==0) //这样写对么???? 59 { 60 61 62 tmppath.push_back(vertex); 63 int need=0, remain=0; 64 for(int i=tmppath.size()-1; i>=0; i--) 65 { 66 int id=tmppath[i]; 67 if(bikes[id]>0) 68 { 69 remain+=bikes[id]; 70 } 71 else if(bikes[id]<0) 72 { 73 if(remain>=abs(bikes[id])) 74 { 75 remain+=bikes[id]; 76 } 77 else 78 { 79 need+=abs(bikes[id])-remain; 80 remain=0;; 81 82 } 83 } 84 } 85 86 if(need<minneed){ 87 minneed=need; 88 minremain=remain; 89 path=tmppath; 90 } 91 else if(need==minneed&&remain<minremain){ 92 minremain=remain; 93 path=tmppath; 94 } 95 tmppath.pop_back();/** big mistake you will never find if you forget*/ 96 return;/** big mistake you will never find if you forget*/ 97 } 98 99 100 101 tmppath.push_back(vertex); 102 103 for(int i=0; i<pre[vertex].size(); i++) 104 { 105 caculatethedemand(pre[vertex][i]); 106 } 107 tmppath.pop_back(); 108 } 109 110 int main() 111 { 112 scanf("%d%d%d%d",&Cmax,&N,&Sp,&M); 113 perfect=Cmax/2; 114 115 116 fill(Mgraph[0],Mgraph[0]+Maxv*Maxv,INF);// 117 118 for(int i=1; i<=N; i++) //读取自行车的数量 119 { 120 int tmp; 121 scanf("%d",&tmp); 122 bikes[i]=tmp-perfect; 123 } 124 for(int i=0; i<M; i++) 125 { 126 int a, b, we; 127 scanf("%d%d%d",&a,&b,&we); 128 Mgraph[a][b]=we; 129 Mgraph[b][a]=we; 130 } 131 dijkstra(0); 132 133 caculatethedemand(Sp); 134 printf("%d ",minneed); 135 136 for(int i=path.size()-1;i>=0;i--){ 137 printf("%d",path[i]); 138 if(i!=0)printf("->"); 139 } 140 printf(" %d",minremain); 141 142 return 0; 143 }