オイラー小路を求めるプログラム
Posted: 2010年12月05日(日) 16:41
オイラー小路(一筆書き)を求めるプログラムをC言語で書きたいのですが困っています。
まず、オイラーグラフかどうかを判定するプログラムは書くことができました。
その後にオイラーグラフならばオイラー小路を求めたいのですが、上手くいきません。
どうすればよいでしょうか?
#include <stdio.h>
#define MAX 10
int a[MAX][MAX];
int n;
int route[MAX]; /* 経路を記憶 */
int Vflag[MAX]; /* すでに通った点を記憶 */
int Eflag[MAX];
int euler(){
int c[MAX];
int i,j,count,odd=0;
int comma;
for(i=0;i<n;i++){
count = 1;
for(j=0;j<n;j++){
if(a[j] == 1){
c = count++;
}
}
}
for(i=0;i<n;i++){
if(c % 2 == 1){ //奇数だったら
odd++;
}
}
if(odd == 0 || odd == 2){ // 奇数の次数を持つ頂点が0か2個か判定
printf("Your graph is Euler\n\n");
printf(" a b c d\n");
for(i=0;i<n;i++){
printf("%c ",'a'+i);
for(j=0;j<n;j++){
printf("%d ",a[j]);
}
printf("\n");
}
return 0;
}else{
printf("Your graph isn't Euler\n");
return 1;
}
}
void tansaku(int k){
int i;
if (n==k) { /* 全点を通った */
printf("%d", route[0]);
for (i=1; i<n; i++) printf("-%d",route);
} else { /* 次の点を探して移動 */
for (i=0; i<n; i++) {
if (Vflag==0) {
Vflag=1; route[k]=i;
tansaku(k+1);
Vflag=0; /* 元にもどす */
}
}
printf("\n");
}
}
int main(void){
int i,j;
int comma;
printf("Vertex\n");
scanf("%d",&n);
for (i=0; i<n; i++) Vflag=0;
for (i=0; i<n; i++) Eflag=0;
for(i=0;i<n;i++){
for(j=0;j<n;j++){
scanf("%d",&a[i][j]);
}
}
printf("V={");
comma=0;
for(i=0;i<n;i++){
if(comma){printf(",");}
printf("%c",'a'+i);
comma=1;
}
printf("},E={");
comma=0;
for(i=0;i<n;i++){
for(j=0;j<n;j++){
if(a[i][j]){
if(comma){printf(",");}
printf("(%c,%c)",'a'+i,'a'+j);
comma=1;
}
}
}
printf("}\n");
euler();
tansaku(0);
return 0;
}
まず、オイラーグラフかどうかを判定するプログラムは書くことができました。
その後にオイラーグラフならばオイラー小路を求めたいのですが、上手くいきません。
どうすればよいでしょうか?
#include <stdio.h>
#define MAX 10
int a[MAX][MAX];
int n;
int route[MAX]; /* 経路を記憶 */
int Vflag[MAX]; /* すでに通った点を記憶 */
int Eflag[MAX];
int euler(){
int c[MAX];
int i,j,count,odd=0;
int comma;
for(i=0;i<n;i++){
count = 1;
for(j=0;j<n;j++){
if(a[j] == 1){
c = count++;
}
}
}
for(i=0;i<n;i++){
if(c % 2 == 1){ //奇数だったら
odd++;
}
}
if(odd == 0 || odd == 2){ // 奇数の次数を持つ頂点が0か2個か判定
printf("Your graph is Euler\n\n");
printf(" a b c d\n");
for(i=0;i<n;i++){
printf("%c ",'a'+i);
for(j=0;j<n;j++){
printf("%d ",a[j]);
}
printf("\n");
}
return 0;
}else{
printf("Your graph isn't Euler\n");
return 1;
}
}
void tansaku(int k){
int i;
if (n==k) { /* 全点を通った */
printf("%d", route[0]);
for (i=1; i<n; i++) printf("-%d",route);
} else { /* 次の点を探して移動 */
for (i=0; i<n; i++) {
if (Vflag==0) {
Vflag=1; route[k]=i;
tansaku(k+1);
Vflag=0; /* 元にもどす */
}
}
printf("\n");
}
}
int main(void){
int i,j;
int comma;
printf("Vertex\n");
scanf("%d",&n);
for (i=0; i<n; i++) Vflag=0;
for (i=0; i<n; i++) Eflag=0;
for(i=0;i<n;i++){
for(j=0;j<n;j++){
scanf("%d",&a[i][j]);
}
}
printf("V={");
comma=0;
for(i=0;i<n;i++){
if(comma){printf(",");}
printf("%c",'a'+i);
comma=1;
}
printf("},E={");
comma=0;
for(i=0;i<n;i++){
for(j=0;j<n;j++){
if(a[i][j]){
if(comma){printf(",");}
printf("(%c,%c)",'a'+i,'a'+j);
comma=1;
}
}
}
printf("}\n");
euler();
tansaku(0);
return 0;
}