我在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;
}
答案 0 :(得分:0)
如果我注释掉 if(!visited [* it]) ,您的代码会通过所有测试用例。为什么还需要访问过的数组?每个邻接列表将只有一个子节点,但最后一个叶节点除外。