1. 程式人生 > 實用技巧 >「題解」 CF507D The Maths Lecture

「題解」 CF507D The Maths Lecture

原題:

程式碼(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;
    
}