WA在SPOJ SCAVHUNT

时间:2013-12-19 22:53:12

标签: c++ dictionary stl

我在this question得到了错误的答案,尽管代码在所有测试用例中都很有趣。 有人可以帮助解决我的代码遗漏的问题吗?我正在使用stl map和简单的dfs来打印问题中提到的路线。

#include<cstdio>
#include<iostream>
#include<map>
#include<list>
#include<cstring>
#define tr(c,it) for(typeof(c.begin()) it=c.begin();it!=c.end();++it)
using namespace std;
map<int,string> city;
list<int> *adj;
bool *visited;
void dfs(int s) {
    visited[s]=true;
    cout<<city[s]<<endl;
    tr(adj[s],it) {
        if(!visited[*it])
            dfs(*it);
    }
}   
main() {
    int t;
    scanf("%d",&t);
    for(int i=1;i<=t;++i) {
        map<string,int> mymap;
        int n;
        scanf("%d",&n); 
        visited=new bool[n+1];
        memset(visited,false,sizeof(visited));
        adj=new list<int>[n+1];
        int indegree[n+1];
        for(int j=0;j<=n;++j) indegree[j]=0;
        int index=1;
        for(int j=0;j<n-1;++j) {
            string n1,n2;
            cin>>n1>>n2;
            if(!mymap[n1]) {
                mymap[n1]=index++;
                city[index-1]=n1;
            }
            if(!mymap[n2]) {
                mymap[n2]=index++;
                city[index-1]=n2;
            }
            adj[mymap[n1]].push_back(mymap[n2]);
            indegree[mymap[n2]]++;
        }
        int start;
        for(int j=1;j<=n;++j) {
            if(indegree[j]==0) {
                start=j;
                break;
            }
        }
        printf("Scenario #%d:\n",i);
        dfs(start);
        printf("\n");
        city.clear();
    }
    return 0;
}

1 个答案:

答案 0 :(得分:0)

如果我注释掉 if(!visited [* it]) ,您的代码会通过所有测试用例。为什么还需要访问过的数组?每个邻接列表将只有一个子节点,但最后一个叶节点除外。