알고리즘 문제 해결전략의 코드에 문제가 있는 것 같습니다.제가 갖고 있는 책은 3쇄인데,
오일러 트레일로 접근했을 시 새로 만든 연결을 처리하는 과정이 문제인 것 같습니다.
4
ab bc ak ka
를 넣었을 때 IMPOSSIBLE이 출력되어야 하는데 가능한 것으로 출력하는데 케이스를 더 추가해야할 것 같습니다.
아래는 제가 작성한 코드인데, 마지막 정답을 출력하는 곳에 주석부분이 필요하다고 생각합니다.
혹시 제가 문제 이해를 잘못한 걸까요?
답변해주시면 감사하겠습니다 :)
~~~ c++
#include
#include
#include
#include
#include
#include
#include
using namespace std;
vector ret;
vector> adj;
vector indegree;
vector outdegree;
void getEulerCircuit(int cur){
for( int next = 0 ; next < 26 ; ++next){
while( adj[cur][next] ){
adj[cur][next]--;
getEulerCircuit(next);
}
}
ret.push_back(cur);
}
int main(){
int c; scanf("%d",&c);
while(c--){
ret.clear();
adj = vector>(26,vector(26));
outdegree = vector(26);
indegree = vector(26);
vector words[26][26];
int n; scanf("%d",&n);
for( int i = 0 ; i < n ; ++i ){
string word; cin >> word;
adj[word[0]-'a'][word[word.length()-1]-'a']++;
words[word[0]-'a'][word[word.length()-1]-'a'].push_back(word);
outdegree[word[0]-'a']++; indegree[word[word.length()-1]-'a']++;
}
bool possible = true;
int plus1 = 0; int minus1 = 0;
for( int i = 0 ; i < 26 ; ++i ){
int delta = outdegree[i]-indegree[i];
if( delta > 1 || delta < -1 ){
possible = false;
break;
}
if ( delta == 1 ) ++plus1;
else if( delta == -1 ) ++minus1;
}
if( possible ) possible = (plus1 == 1 && minus1 == 1 ) || (plus1 == 0 && minus1 == 0 );
if( !possible ){
printf("IMPOSSIBLE\n");
continue;
}
for( int i = 0 ; i < 26 ; ++i ){
if( outdegree[i] == indegree[i]+1 ){
int start = i;
// int dest;
// for( int j = 0 ; j < 26 ; ++j ){
// if(indegree[i] == outdegree[i]+1){
// dest = i;
// break;
// }
// }
// adj[dest][start] = true;
getEulerCircuit(start);
break;
}
}
if( ret.empty() ){
for( int i = 0 ; i < 26 ; ++i ){
if(outdegree[i]){
getEulerCircuit(i);
break;
}
}
}
if( ret.size() != n+1 ) printf("IMPOSSIBLE\n");
else{
reverse(ret.begin(), ret.end());
string ans;
for( int i = 1 ; i < ret.size() ; ++i ){
if( ans.size() ) ans += " ";
// if( words[ret[i-1]][ret[i]].empty() ){
// ans = "IMPOSSIBLE";
// break;
// }
ans += words[ret[i-1]][ret[i]].back();
words[ret[i-1]][ret[i]].pop_back();
}
printf("%s\n", ans.c_str());
}
}
return 0;
}
~~~
leechhe90
알고리즘 문제 해결전략의 코드에 문제가 있는 것 같습니다.제가 갖고 있는 책은 3쇄인데,
오일러 트레일로 접근했을 시 새로 만든 연결을 처리하는 과정이 문제인 것 같습니다.
4
ab bc ak ka
를 넣었을 때 IMPOSSIBLE이 출력되어야 하는데 가능한 것으로 출력하는데 케이스를 더 추가해야할 것 같습니다.
아래는 제가 작성한 코드인데, 마지막 정답을 출력하는 곳에 주석부분이 필요하다고 생각합니다. ret;> adj; indegree; outdegree;>(26,vector(26));(26);(26); words[26][26];
혹시 제가 문제 이해를 잘못한 걸까요?
답변해주시면 감사하겠습니다 :)
~~~ c++
#include
#include
#include
#include
#include
#include
#include
using namespace std;
vector
vector
vector
vector
void getEulerCircuit(int cur){
for( int next = 0 ; next < 26 ; ++next){
while( adj[cur][next] ){
adj[cur][next]--;
getEulerCircuit(next);
}
}
ret.push_back(cur);
}
int main(){
int c; scanf("%d",&c);
while(c--){
ret.clear();
adj = vector
outdegree = vector
indegree = vector
vector
// int dest;
// for( int j = 0 ; j < 26 ; ++j ){
// if(indegree[i] == outdegree[i]+1){
// dest = i;
// break;
// }
// }
// adj[dest][start] = true;
getEulerCircuit(start);
break;
}
}
if( ret.empty() ){
for( int i = 0 ; i < 26 ; ++i ){
if(outdegree[i]){
getEulerCircuit(i);
break;
}
}
}
if( ret.size() != n+1 ) printf("IMPOSSIBLE\n");
else{
reverse(ret.begin(), ret.end());
string ans;
for( int i = 1 ; i < ret.size() ; ++i ){
if( ans.size() ) ans += " ";
// if( words[ret[i-1]][ret[i]].empty() ){
// ans = "IMPOSSIBLE";
// break;
// }
ans += words[ret[i-1]][ret[i]].back();
words[ret[i-1]][ret[i]].pop_back();
}
printf("%s\n", ans.c_str());
}
}
return 0;
}
~~~
10년 전