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 }
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 }
另:一种错误(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 }
浙公网安备 33010602011771号