01/10/2018, 09:32
Giúp đỡ chu trình euler
mình có bài toán: Ở một đất nước có n thành phố. Giữa các thành phố có các tuyến đường (1 chiều). Biết rằng:
1. Giữa 2 thành phố bất kỳ có thể đi đến nhau (có thể qua nhiều tuyến đường).
2. Từ 1 thành phố số các đường đi ra bằng số các đường đi vào.
Lập thuật toán tìm một con đường xuất phát từ một thành phố nào đó, đi qua tất cả các tuyến đường, mỗi tuyến đường 1 lần, cuối cùng trở về thành phố ban đầu.
chương trình mình viết ntn:
input.txt // dòng đầu là tổng số đỉnh // các dòng tiếp theo là u ,v, k ( k đường 1 chiều từ u đến v)
4
1 2 1
1 3 1
1 4 1
2 1 1
2 3 2
2 4 1
3 1 1
3 2 1
3 4 2
4 1 1
4 2 2
4 3 1
main.cpp
#include <stdio.h>
int a[50][50];
int stack[50];
int n,last;
//Nhap du lieu
void getData(){
int u,v,k;
FILE *fp;
fp = fopen("input1.txt", "rb");
fscanf(fp, "%d", &n);
for(int i=0;i<n*(n-1);i++){
fscanf(fp, "%d", &u);
fscanf(fp, "%d", &v);
fscanf(fp, "%d", &k);
a[u][v]=k;
}
fclose(fp);
}
//day 1 dinh v vap ngan xep
void push(int v){
last++;
stack[last] = v;
}
//lay 1 dinh khoi ngan xep, tra ve trong ket qua ham
int pop(){
int p;
p=stack[last];
last--;
return p;
}
//tra ve phan tu o donh ngan xep
int get(){
return stack[last];
}
void findEuler(){
int u,v,count;
stack[1]=1; //khoi tao ngan xep ban dau chi gom dinh 1
last=1;
count=0;
while(last!=0){ //chung nao ngan xep chua rong
u=get(); //xac dinh u la phan tu o dinh ngan xep
for(v=1;v<=n;v++){ // xet tat ca cac duong co the di tu u->v
if (a[u][v] > 0){
a[u][v]=a[u][v]-1; //xoa canh khoi do thi
push(v); //day dinh tiep theo vao ngan xep
break;
}
}
if(u=get()){ //neu phan tu o dinh ngap xep van la u, vong lap ko tiep thay dinh nao di tu u
count++;
printf("%d ",pop()); //in ra phan tu dinh ngan xep
}
}
}
main(){
getData();
findEuler(); }
chương trình trên mình viết chỉ xử lý đối với bài toán giữa 2 thành phố chỉ có 1 đường 1 chiều. vậy làm sao để xử lí đối với bài giữa 2 tp có nhìu đường 1 chiều???
Bài liên quan