☆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 }

猜你喜欢

转载自www.cnblogs.com/flipped415/p/10411016.html