快速冪——你的飛碟在這兒Your Ride Is Here
阿新 • • 發佈:2021-01-09
原題:
程式碼(dfs):
#include<iostream> #include<vector> #include<unordered_map> #include<limits.h> using namespace std; int mindis[201]; vector <int> path; int num_way;//number of the same ways int destination; string namelist[200]; int happy[200]; int dis[200][200]; vector<int> final_path; int final_dis,final_happy,final_step; vector<int> v[200];// its neghbor unordered_map<string,int>city_num; void dfs (int curcity,int curdis,int curhappy,int curstep) { if( curdis> mindis[curdis]) return;//stop loss path.emplace_back(curcity); if(curcity == destination)//如果到了終點 { if(curdis < mindis[destination]) { mindis[destination] = curdis; final_path = path; final_dis = curdis; final_happy = curhappy; final_step = curstep; num_way = 1; } if(curdis == mindis[destination]) //equal case { num_way++; if(curhappy> final_happy || (curhappy == final_happy && curstep < final_step)) { final_path = path; final_dis = curdis; final_happy = curhappy; final_step = curstep; } } } else // not reach the destination { if( curdis < mindis[curdis]) mindis[curcity] = curdis; for(int each:v[curcity])//find the neighbor { dfs(each,curdis+dis[curcity][each],curhappy+happy[each],curstep+1); } } path.pop_back(); } int main() { int N,K; //N是城市數,K是路的數量 string s_city; cin>>N>>K>>s_city; city_num[s_city] = 0; namelist[0] = s_city; for(int i =1;i<=N-1;i++) mindis[i] = INT_MAX; //接下來的N-1行: 城市名 幸福值 string city;happy[0] = 0; for(int i = 1;i<=N-1;i++ ) { cin>>city>>happy[i]; city_num[city] = i; //將城市轉化為數字序號便於dfs namelist[i] = city; } //接下來存城市之間的距離,用城市序號表示 string s1,s2;int d; int c1,c2; while(K--) { cin>>s1>>s2>>d; dis[city_num[s1]][city_num[s2]] = d; dis[city_num[s2]][city_num[s1]] = d; c1 = city_num[s1];c2= city_num[s2]; v[c1].emplace_back(c2); v[c2].emplace_back(c1); } destination =city_num["ROM"]; dfs(0,0,0,0); cout<<num_way<<" "<<final_dis<<" "<<final_happy<<" "<<final_happy/final_step<<endl; cout<<s_city; for(unsigned int i = 1;i<final_path.size();i++) cout<<"->"<<namelist[final_path[i]]; return 0; }
結果只是部分正確:
如果改一下,
if(curdis == mindis[destination]) //equal case
其實可以改成else
程式碼:
#include<iostream> #include<vector> #include<unordered_map> #include<limits.h> using namespace std; int mindis[201]; vector <int> path; int num_way;//number of the same ways int destination; string namelist[200]; int happy[200]; int dis[200][200]; vector<int> final_path; int final_dis,final_happy,final_step; vector<int> v[200];// its neghbor unordered_map<string,int>city_num; void dfs (int curcity,int curdis,int curhappy,int curstep) { if( curdis> mindis[curdis]) return;//stop loss path.emplace_back(curcity); if(curcity == destination)//如果到了終點 { if(curdis < mindis[destination]) { mindis[destination] = curdis; final_path = path; final_dis = curdis; final_happy = curhappy; final_step = curstep; num_way = 1; } else //equal case { num_way++; if(curhappy> final_happy || (curhappy == final_happy && curstep < final_step)) { final_path = path; final_dis = curdis; final_happy = curhappy; final_step = curstep; } } } else // not reach the destination { if( curdis < mindis[curdis]) mindis[curcity] = curdis; for(int each:v[curcity])//find the neighbor { dfs(each,curdis+dis[curcity][each],curhappy+happy[each],curstep+1); } } path.pop_back(); } int main() { int N,K; //N是城市數,K是路的數量 string s_city; cin>>N>>K>>s_city; city_num[s_city] = 0; namelist[0] = s_city; for(int i =1;i<=N-1;i++) mindis[i] = INT_MAX; //接下來的N-1行: 城市名 幸福值 string city;happy[0] = 0; for(int i = 1;i<=N-1;i++ ) { cin>>city>>happy[i]; city_num[city] = i; //將城市轉化為數字序號便於dfs namelist[i] = city; } //接下來存城市之間的距離,用城市序號表示 string s1,s2;int d; int c1,c2; while(K--) { cin>>s1>>s2>>d; dis[city_num[s1]][city_num[s2]] = d; dis[city_num[s2]][city_num[s1]] = d; c1 = city_num[s1];c2= city_num[s2]; v[c1].emplace_back(c2); v[c2].emplace_back(c1); } destination =city_num["ROM"]; dfs(0,0,0,0); cout<<num_way<<" "<<final_dis<<" "<<final_happy<<" "<<final_happy/final_step<<endl; cout<<s_city; for(unsigned int i = 1;i<final_path.size();i++) cout<<"->"<<namelist[final_path[i]]; return 0; }
最終竟然全錯、。。。
感覺應該是很簡單的一個dfs,不知道為什麼這個num_way 總是錯誤
找了一晚上,後來很生氣地發現:
有個地方 curdis和curcity太像了,變數名起的像,都有current 想表示現在的距離和城市
我給搞混了
之後程式碼是:
#include<iostream> #include<vector> #include<unordered_map> #include<limits.h> using namespace std; int mindis[201]; vector <int> path; int num_way;//number of the same ways int destination; string namelist[200]; int happy[200]; int dis[200][200]; vector<int> final_path; int final_dis,final_happy,final_step; vector<int> v[200];// its neghbor unordered_map<string,int>city_num; void dfs (int curcity,int curdis,int curhappy,int curstep) { if( curdis> mindis[curcity]) return;//stop loss path.emplace_back(curcity); if(curcity == destination)//如果到了終點 { if(curdis < mindis[destination]) { mindis[destination] = curdis; final_path = path; final_dis = curdis; final_happy = curhappy; final_step = curstep; num_way = 1; } else //equal case { num_way++; if(curhappy> final_happy || (curhappy == final_happy && curstep < final_step)) { final_path = path; final_dis = curdis; final_happy = curhappy; final_step = curstep; } } } else // not reach the destination { if( curdis < mindis[curdis]) mindis[curcity] = curdis; for(int each:v[curcity])//find the neighbor { dfs(each,curdis+dis[curcity][each],curhappy+happy[each],curstep+1); } } path.pop_back(); } int main() { int N,K; //N是城市數,K是路的數量 string s_city; cin>>N>>K>>s_city; city_num[s_city] = 0; namelist[0] = s_city; for(int i =1;i<=N-1;i++) mindis[i] = INT_MAX; //接下來的N-1行: 城市名 幸福值 string city;happy[0] = 0; for(int i = 1;i<=N-1;i++ ) { cin>>city>>happy[i]; city_num[city] = i; //將城市轉化為數字序號便於dfs namelist[i] = city; } //接下來存城市之間的距離,用城市序號表示 string s1,s2;int d; int c1,c2; while(K--) { cin>>s1>>s2>>d; dis[city_num[s1]][city_num[s2]] = d; dis[city_num[s2]][city_num[s1]] = d; c1 = city_num[s1];c2= city_num[s2]; v[c1].emplace_back(c2); v[c2].emplace_back(c1); } destination =city_num["ROM"]; dfs(0,0,0,0); cout<<num_way<<" "<<final_dis<<" "<<final_happy<<" "<<final_happy/final_step<<endl; cout<<s_city; for(unsigned int i = 1;i<final_path.size();i++) cout<<"->"<<namelist[final_path[i]]; return 0; }