Code tìm bậc của các đỉnh đồ thị bị runtime

Em chào anh, chị em có code bằng c++ bài toán tìm bậc mỗi đỉnh của đồ thị nhưng có 1 vài test case ẩn bị runtime. Em đã xử lý rất lâu mà không được, nên em lên đây để nhờ anh chị giúp ạ. Em cảm ơn.
Đề bài: Dòng đầu tiên chứa 02 số là số đỉnh và cạnh của đồ thị
Dòng tiếp theo là danh sách tên các đỉnh của đồ thị. Các dòng tiếp theo là các cạnh.
Đây là input mẫu ạ:
6 11
K R O Q H S
H R
S Q
O S
O R
S K
H S
Q O
Q H
O H
Q R
K Q

Output :2 3 4 5 4 4

#include <iostream>
#include <cstring>

using namespace std;

int main() {
	int v,e,color[1000][1000],degrees[1000];
	char c[1000];
	cin>>v>>e;
	for (int i=0;i<v;i++){
		cin>>c[i];
	}
	for (int i=0;i<v;i++){
		for (int j=0;j<v;j++){
			color[i][j]=0;
		}
	}
	for (int j=0;j<e;j++){
		char a,b;
		int x,y;
		cin>>a>>b;
		for (int i=0;i<v;i++){
	     	if (int(c[i])==int(a)){
		        x=i;
	     	}
	     	if (int(c[i])==int(b)){
		        y=i;
	     	}
           	}
        color[x][y]=1;
        color[y][x]=1;
	}
    for (int i=0;i<v;i++){
    	 degrees[i]=0;
    	int degree=0;
    	for (int j=0;j<v;j++){
	          if (color[i][j]==1){
	          	degree++;
	          }
	     	}
	     if (color[i][i]==1){
	          	degree++;
	          }
	     degrees[i]=degree;
    }
   for (int i=0;i<v;i++){
    	cout<<degrees[i]<<" ";
    }
	return 0;
}

Code của bạn xử lý có hơi cồng kềnh, nhưng có vẻ như là đúng, không có vấn đề gì
Bạn cho thể nói rõ hơn về runtime error message cụ thể không? (hay trình chấm bài chỉ đưa ra lỗi chung chung)
Vì nếu cạnh chỉ gồm 1 kí tự chữ hoa như ví dụ, thì O(n^3) cũng không phải là vấn đề

Hoặc bạn có thể post bài gốc lên, biết đâu mọi người có thể giúp bạn phân tích và cải thiện giải pháp

2 Likes


Đây là đề bài gốc ạ. Em có làm cách khác và kết quả là wrong thay vì runtime ạ. Em có nghĩ mà vẫn không thể nghĩ ra là thiếu trường hợp nào.

chỉ ra chung chung thôi ạ

Đỉnh của đồ thị là chụỗi, gồm 1 hoặc nhiều kí tự hoa
Bạn đang dùng char

3 Likes

Cảm ơn bạn nhiều ạ. Mình đã sửa được rồi theo gợi ý của bạn!

1 Like

Gợy ý thêm cho bạn

Bậc của đồ thị, là số cạnh có gắn với đỉnh đó
=> mỗi lần bạn đọc vào một cạnh, bạn chỉ cần cộng biến đếm của cạnh đó thêm 1 là được

sau bước nhập bạn sẽ có một danh sách đỉnh có giá trị như này
arr_v = [“A”, “B”, “EE”, “ZZZ” ]
khởi tại một mảng arr_count với ý nghĩa là bậc của đỉnh tương ứng arr_v
arr_count [0,0,0,0]

đọc vào từng cạnh
A ZZZ
dòng trên ý nghĩa là có cạnh nối từ A ZZZ, như vậy, bậc của ZZZ và A sẽ tăng lên 1
arr_count[indexOf(arr_v, “A”)] += 1; // bạn tự viết hàm indexOf(arr, value) tìm vị trí(index) của value trong mảng arr (giống vòng for trên code của bạn đã viết ở trên, chỉ là move nó ra thành hàm thôi)
kết qủa
arr_count = [1, 0, 0, 1] // vị trí của A và ZZZ tăng thêm 1

kết quả cuối cùng là mảng arr_count

Bạn cũng có thể giải quết được bài này bằng nhiều cách khác hay hơn nữa, dùng set + map/dictionary (tùy ngôn ngữ gọi tên), bla bla…

Dù sao làm bài tập không phải chỉ để nộp, mà còn là rèn luyện, phát triển tư duy, ý tưởng
Có gắng tự hoàn thiện bản thân

4 Likes

Cảm ơn bạn nhiều vì đã góp ý.

2 Likes
83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?