PAT A1018

A 1018 Public Bike Management

  这个题目算是比较典型的一个。我分别用dfs,及dijkstra+dfs实现了一下。

dfs实现代码:

 1 #include <cstdio>
 2 #include <iostream>
 3 #include <vector>
 4 #include <algorithm>
 5 #include <cmath>
 6 #include <cstring>
 7 using namespace std;
 8 #define MAXNUM 510
 9 #define CLR(a,b) memset(a,b,sizeof(a));
10 const int INF = 0x7f7f7f7f;
11 int C, N, Sp, M, dstDis = INF, tmpDstDis = 0, dstSendBikeNum = INF, dstBackBikeNum = INF;
12 vector<int> dstPathVec, tmpPathVec, routeVec[MAXNUM];
13 vector<int> bikeNumStaVec(MAXNUM,0);
14 vector<int> visitFlagVec(MAXNUM,false);
15 int route[MAXNUM][MAXNUM];
16 void dfs(int u)
17 {
18     if(u == Sp && tmpDstDis <= dstDis)
19     {
20         int halfC = C/2, tmpBikeNum = 0, tmpSendBikeNum = 0, tmpBackBikeNum = 0;
21         for(int i = 1; i < tmpPathVec.size(); ++ i)
22         {
23             tmpBikeNum += halfC-bikeNumStaVec[tmpPathVec[i]];
24             if(tmpBikeNum > 0)
25             {
26                 tmpSendBikeNum += tmpBikeNum;
27                 tmpBikeNum = 0;
28             }
29         }
30         tmpBackBikeNum = -tmpBikeNum;
31         if(tmpDstDis < dstDis)
32         {
33             dstSendBikeNum = tmpSendBikeNum;
34             dstBackBikeNum = tmpBackBikeNum;
35             dstDis = tmpDstDis;
36             dstPathVec = tmpPathVec;
37         }
38         else if((tmpSendBikeNum < dstSendBikeNum) || (dstSendBikeNum == tmpSendBikeNum && dstBackBikeNum > tmpBackBikeNum))
39         {
40             dstSendBikeNum = tmpSendBikeNum;
41             dstBackBikeNum = tmpBackBikeNum;
42             dstDis = tmpDstDis;
43             dstPathVec = tmpPathVec;
44         }
45         return;
46     }
47     if(tmpDstDis > dstDis)
48         return;
49     for(auto it = routeVec[u].begin(); it != routeVec[u].end(); ++ it)
50     {
51         if(!visitFlagVec[*it])
52         {
53             visitFlagVec[*it] = true;
54             tmpPathVec.push_back(*it);
55             tmpDstDis += route[u][*it];
56             dfs(*it);
57             tmpDstDis -= route[u][*it];
58             tmpPathVec.pop_back();
59             visitFlagVec[*it] = false;
60         }
61     }
62 }
63 int main()
64 {
65     cin >> C >> N >> Sp >> M;
66     int tmpSt, tmpEnd, tmpDis;
67     for(int i = 1; i <= N; ++i)
68         cin >> bikeNumStaVec[i];
69     CLR(route,0x7f);
70     while(M--)
71     {
72         cin >> tmpSt >> tmpEnd >> tmpDis;
73         route[tmpSt][tmpEnd] = tmpDis;
74         route[tmpEnd][tmpSt] = tmpDis;
75         routeVec[tmpSt].push_back(tmpEnd);
76         routeVec[tmpEnd].push_back(tmpSt);
77     }
78     visitFlagVec[0] = true;
79     tmpPathVec.push_back(0);
80     dfs(0);
81     cout << dstSendBikeNum;
82     for(int i = 0; i < dstPathVec.size(); ++i)
83     {
84         if(i == 0)  printf(" ");
85         else        printf("->");
86         cout << dstPathVec[i];
87     }
88     cout << " " << dstBackBikeNum;
89     return 0;
90 }
View Code

dijkstra和dfs实现代码

  1 #include <cstdio>
  2 #include <iostream>
  3 #include <vector>
  4 #include <algorithm>
  5 #include <cmath>
  6 #include <cstring>
  7 using namespace std;
  8 #define MAXNUM 510
  9 #define CLR(a,b) memset(a,b,sizeof(a));
 10 const int INF = 0x7f7f7f7f;
 11 int C, N, Sp, M, dstSendBikeNum = INF, dstBackBikeNum = INF;
 12 vector<int> dstPathVec, tmpPathVec, preRoute[MAXNUM];
 13 vector<int> bikeNumStaVec(MAXNUM,0);
 14 vector<int> visitFlagVec(MAXNUM,false);
 15 int dis[MAXNUM];
 16 int route[MAXNUM][MAXNUM];
 17 void dijkstra(int u)
 18 {
 19     dis[u] = 0;
 20     for(int i = 0; i <= N; ++ i)
 21     {
 22         int tmpMinDis = INF, v = -1;
 23         for(int j = 0; j <= N; ++ j)
 24         {
 25             if(!visitFlagVec[j] && dis[j] < tmpMinDis)
 26             {
 27                 v = j;
 28                 tmpMinDis = dis[j];
 29             }
 30         }
 31         if(v == -1 || v == Sp)
 32             return;
 33         visitFlagVec[v] = true;
 34         for(int j = 1; j <= N; ++ j)
 35         {
 36             if(!visitFlagVec[j] && dis[j] > dis[v] + route[v][j])
 37             {
 38                 dis[j] = dis[v] + route[v][j];
 39                 preRoute[j].clear();
 40                 preRoute[j].push_back(v);
 41             }
 42             else if(!visitFlagVec[j] && dis[j] == dis[v] + route[v][j])
 43                 preRoute[j].push_back(v);
 44         }
 45     }
 46 }
 47 void dfs(int u)
 48 {
 49     if(u == 0)
 50     {
 51         tmpPathVec.push_back(u);
 52         int halfC = C/2, tmpBikeNum = 0, tmpSendBikeNum = 0, tmpBackBikeNum = 0;
 53         for(int i = tmpPathVec.size()-2; i >= 0; -- i)
 54         {
 55             tmpBikeNum += halfC-bikeNumStaVec[tmpPathVec[i]];
 56             if(tmpBikeNum > 0)
 57             {
 58                 tmpSendBikeNum += tmpBikeNum;
 59                 tmpBikeNum = 0;
 60             }
 61         }
 62         tmpBackBikeNum = -tmpBikeNum;
 63         if((tmpSendBikeNum < dstSendBikeNum) || (dstSendBikeNum == tmpSendBikeNum && dstBackBikeNum > tmpBackBikeNum))
 64         {
 65             dstSendBikeNum = tmpSendBikeNum;
 66             dstBackBikeNum = tmpBackBikeNum;
 67             dstPathVec = tmpPathVec;
 68         }
 69         tmpPathVec.pop_back();
 70         return;
 71     }
 72     tmpPathVec.push_back(u);
 73     for(auto it = preRoute[u].begin(); it != preRoute[u].end(); ++ it)
 74         dfs(*it);
 75     tmpPathVec.pop_back();
 76 }
 77 int main()
 78 {
 79     cin >> C >> N >> Sp >> M;
 80     int tmpSt, tmpEnd, tmpDis;
 81     for(int i = 1; i <= N; ++i)
 82         cin >> bikeNumStaVec[i];
 83     CLR(route,0x7f);
 84     CLR(dis,0x7f);
 85     while(M--)
 86     {
 87         cin >> tmpSt >> tmpEnd >> tmpDis;
 88         route[tmpSt][tmpEnd] = tmpDis;
 89         route[tmpEnd][tmpSt] = tmpDis;
 90     }
 91     dijkstra(0);
 92     dfs(Sp);
 93     cout << dstSendBikeNum;
 94     reverse(dstPathVec.begin(), dstPathVec.end());
 95     for(int i = 0; i < dstPathVec.size(); ++i)
 96     {
 97         if(i == 0)  printf(" ");
 98         else        printf("->");
 99         cout << dstPathVec[i];
100     }
101     cout << " " << dstBackBikeNum;
102     return 0;
103 }
View Code

另:一种错误(dfs中,最后判断第二条件时出现了错误)

  1 #include <cstdio>
  2 #include <iostream>
  3 #include <vector>
  4 #include <algorithm>
  5 #include <cmath>
  6 #include <cstring>
  7 using namespace std;
  8 #define MAXNUM 510
  9 #define CLR(a,b) memset(a,b,sizeof(a));
 10 const int INF = 0x7f7f7f7f;
 11 int C, N, Sp, M, dstSendBikeNum = INF, dstBackBikeNum = INF;
 12 vector<int> dstPathVec, tmpPathVec, preRoute[MAXNUM];
 13 vector<int> bikeNumStaVec(MAXNUM,0);
 14 vector<int> visitFlagVec(MAXNUM,false);
 15 int dis[MAXNUM];
 16 int route[MAXNUM][MAXNUM];
 17 void dijkstra(int u)
 18 {
 19     dis[u] = 0;
 20     for(int i = 0; i <= N; ++ i)
 21     {
 22         int tmpMinDis = INF, v = -1;
 23         for(int j = 0; j <= N; ++ j)
 24         {
 25             if(!visitFlagVec[j] && dis[j] < tmpMinDis)
 26             {
 27                 v = j;
 28                 tmpMinDis = dis[j];
 29             }
 30         }
 31         if(v == -1 || v == Sp)
 32             return;
 33         visitFlagVec[v] = true;
 34         for(int j = 1; j <= N; ++ j)
 35         {
 36             if(!visitFlagVec[j] && dis[j] > dis[v] + route[v][j])
 37             {
 38                 dis[j] = dis[v] + route[v][j];
 39                 preRoute[j].clear();
 40                 preRoute[j].push_back(v);
 41             }
 42             else if(!visitFlagVec[j] && dis[j] == dis[v] + route[v][j])
 43                 preRoute[j].push_back(v);
 44         }
 45     }
 46 }
 47 void dfs(int u)
 48 {
 49     if(u == 0)
 50     {
 51         tmpPathVec.push_back(u);
 52         int tmpBikeNum = 0, tmpBackBikeNum = 0;
 53         for(int i = 0; i < tmpPathVec.size()-1; ++i)
 54         {
 55             tmpBikeNum += bikeNumStaVec[tmpPathVec[i]]-C/2;
 56             if(tmpBikeNum > 0)
 57             {
 58                 tmpBackBikeNum += tmpBikeNum;
 59                 tmpBikeNum = 0;
 60             }
 61         }
 62         tmpBikeNum = -tmpBikeNum;
 63         if(tmpBikeNum < dstSendBikeNum)
 64         {
 65             dstSendBikeNum = tmpBikeNum;
 66             dstBackBikeNum = tmpBackBikeNum;
 67             dstPathVec = tmpPathVec;
 68         }
 69         else if(tmpBikeNum == dstSendBikeNum && tmpBackBikeNum < dstBackBikeNum)
 70         {
 71             dstPathVec == tmpPathVec;
 72             dstBackBikeNum = tmpBackBikeNum;
 73         }
 74         tmpPathVec.pop_back();
 75         return;
 76     }
 77     tmpPathVec.push_back(u);
 78     for(auto it = preRoute[u].begin(); it != preRoute[u].end(); ++ it)
 79         dfs(*it);
 80     tmpPathVec.pop_back();
 81 }
 82 int main()
 83 {
 84     cin >> C >> N >> Sp >> M;
 85     int tmpSt, tmpEnd, tmpDis;
 86     for(int i = 1; i <= N; ++i)
 87         cin >> bikeNumStaVec[i];
 88     CLR(route,0x7f); 
 89     CLR(dis,0x7f);
 90     while(M--)
 91     {
 92         cin >> tmpSt >> tmpEnd >> tmpDis;
 93         route[tmpSt][tmpEnd] = tmpDis;
 94         route[tmpEnd][tmpSt] = tmpDis;
 95     }
 96     dijkstra(0);
 97     dfs(Sp);
 98     cout << dstSendBikeNum;
 99     reverse(dstPathVec.begin(), dstPathVec.end());
100     for(int i = 0; i < dstPathVec.size(); ++i)
101     {
102         if(i == 0)  printf(" ");
103         else        printf("->");
104         cout << dstPathVec[i];
105     }
106     cout << " " << dstBackBikeNum;
107     return 0;
108 }
View Code

 

posted on 2019-08-30 15:02  ChangeUp  阅读(240)  评论(0)    收藏  举报

导航