这题在搞清楚思路绕过坑后,还是可以写的出通过sample data的代码的。但是不能AC,让我很气。

最后查清原因:还是对dfs本质理解的不够。

wa代码:

vis[s]=1;
dfs(s,e,0);

殊不知本题有多个查询数据。如果只调用一遍还可以蒙混过关,但是这样的错误必然导致wa

ac代码:

vis[s]=1;
dfs(s,e,0);
vis[s]=0;

参考柳诺博客修改的AC代码:

#include <stdio.h>
#include <memory.h>
#include <math.h>
#include <string>
#include <vector>
#include <set>
#include <stack>
#include <queue>
#include <algorithm>
#include <map>


#define I scanf
#define OL puts
#define O printf
#define F(a,b,c) for(a=b;a<c;a++)
#define FF(a,b) for(a=0;a<b;a++)
#define FG(a,b) for(a=b-1;a>=0;a--)
#define LEN 10000
#define MAX 0x06FFFFFF
#define V vector<int>

using namespace std;

vector<int> g[LEN];
int line[LEN][LEN];
int vis[LEN];
vector<int> path;
vector<int> ans;
int min_d=MAX;
int min_ls=MAX;

int N,M,K;

int calc_ls(){
    int cnt=-1,preLine=0;
    for(int i=1;i<path.size();i++){
        if(line[path[i-1]][path[i]]!=preLine) cnt++;
        preLine=line[path[i-1]][path[i]];
    }
    return cnt;
}

void dfs(int s,int e,int d){
    if(s==e){
        int ls=calc_ls();
        if(d<min_d || (d==min_d && ls<min_ls)){
            min_d=d;
            min_ls=ls;
            ans=path;
        }
        return;
    }
    int i;
    FF(i,g[s].size()){
        int o=g[s][i];
        if(!vis[o]){
            vis[o]=1;
            path.push_back(o);
            dfs(o,e,d+1);
            vis[o]=0;
            path.pop_back();
        }
    }

}

void printLine(){
    int s=ans[0];
    int preL=0;
    int i;
    F(i,1,ans.size()){
        if(line[ans[i-1]][ans[i]]!=preL){
            if(preL) printf("Take Line#%d from %04d to %04d.\n",preL,s,ans[i-1]);
            s=ans[i-1];
            preL=line[ans[i-1]][ans[i]]; 
        }
    }
    printf("Take Line#%d from %04d to %04d.\n",preL,s,ans[i-1]);
}

int main(){
//    freopen("1131.txt","r",stdin);
    int s,e,i,j;
    I("%d",&N);
    F(i,1,N+1){
        int pre,p=-1;
        I("%d",&M);
        while(M--){
            pre=p;
            I("%d",&p);
            if(pre>=0){
                g[p].push_back(pre);
                g[pre].push_back(p);
                line[p][pre]=i;
                line[pre][p]=i;
            }
        }
    }
    I("%d",&K);
    while(K--){
        min_d=MAX;
        min_ls=MAX;
        path.clear();
        ans.clear();
        I("%d%d",&s,&e);
        path.push_back(s);
        vis[s]=1;
        dfs(s,e,0);
        vis[s]=0;
        O("%d\n",min_d);
        printLine();
    }
    return 0;
}
View Code

相关文章:

  • 2021-11-19
  • 2021-11-03
  • 2021-05-29
  • 2022-03-06
  • 2021-07-26
  • 2022-12-23
  • 2022-12-23
  • 2022-01-24
猜你喜欢
  • 2022-12-23
  • 2021-12-28
  • 2021-08-26
  • 2022-12-23
  • 2021-06-11
  • 2021-10-15
  • 2021-07-28
相关资源
相似解决方案