/*DFS를 이용해 하나의 헤밀턴 회로를 구하는 프로그렘
입력 ;
첫줄엔 정점의 갯수와 간선의 갯수.
한줄은 한게의 간선에 연결된 한쪽 정점과 다른쪽 정점을 나타낸다
*/
#include <iostream>
#include <windows.h>
using namespace std;
bool a[100][100],check[100];
int path[100],c;
int n,m;
bool hamilton(int vertex){
path[c]=vertex;
int i;
if(c==n-1&&a[vertex][path[0]]){
for(i=0;i<n;i++)cout<<path[i]+1<<" ";
cout<<path[0]+1<<endl;
return true;
}
c++;
check[vertex]=true;
for(i=0;i<n;i++){
if(a[vertex][i]&&!check[i]){
if(hamilton(i))return true;
}
}
check[vertex]=false;
c--;
return false;
}
int main(){
int i;
int x,y;
cin>>n>>m;
for(i=0;i<m;i++){
cin>>x>>y;
a[x-1][y-1]=a[y-1][x-1]=true;
}
for(i=0;i<n;i++){
if(hamilton(i))break;
}
system("PAUSE");
return 0;
}
실행결과
4 5
1 2
1 3
2 3
2 4
3 4
1 2 4 3 1
Press any key to continue . . .
입력 ;
첫줄엔 정점의 갯수와 간선의 갯수.
한줄은 한게의 간선에 연결된 한쪽 정점과 다른쪽 정점을 나타낸다
*/
#include <iostream>
#include <windows.h>
using namespace std;
bool a[100][100],check[100];
int path[100],c;
int n,m;
bool hamilton(int vertex){
path[c]=vertex;
int i;
if(c==n-1&&a[vertex][path[0]]){
for(i=0;i<n;i++)cout<<path[i]+1<<" ";
cout<<path[0]+1<<endl;
return true;
}
c++;
check[vertex]=true;
for(i=0;i<n;i++){
if(a[vertex][i]&&!check[i]){
if(hamilton(i))return true;
}
}
check[vertex]=false;
c--;
return false;
}
int main(){
int i;
int x,y;
cin>>n>>m;
for(i=0;i<m;i++){
cin>>x>>y;
a[x-1][y-1]=a[y-1][x-1]=true;
}
for(i=0;i<n;i++){
if(hamilton(i))break;
}
system("PAUSE");
return 0;
}
실행결과
4 5
1 2
1 3
2 3
2 4
3 4
1 2 4 3 1
Press any key to continue . . .
댓글
댓글 쓰기