CTDL: chuyển đồ thị từ danh sách cạnh sang danh sách kề

mọi người cho mình hỏi đoạn này, mình có làm thuật toán như miêu tả ở trên nhưng đến lúc chạy ở hàm main sau khi nhập xong V,E,a,b thì hàm addEdge không thực hiện và báo stopping, mình nghĩ do cơ chế push_back của vector nhưng không biết sai chỗ nào, nhờ mọi người giúp ạ.

#include<bits/stdc++.h> 
using namespace std; 
void addEdge(vector<int> adj[], int u, int v) 
{ 
    adj[u].push_back(v); 
    adj[v].push_back(u); 
} 
void printGraph(vector<int> adj[], int V) 
{ 
    for (int v = 0; v < V; ++v) 
    { 
        for (int i=0;i<adj[v].size();i++){
        	cout <<adj[v][i] ;
		}
        cout<<endl;   
    } 
} 
int main() 
{ 
    int V,E,a,b;  cin>>V>>E; // V la so dinh, E la so canh
    vector<int> adj[V]; 
    for(int i=1;i<=E;i++){
    	cin>>a>>b;
    	addEdge(adj,a,b);
	}
    printGraph(adj,V); 
    return 0; 
} 

Khả năng cao a, b của bạn có giá trị lớn hơn hoặc bằng V. :slight_smile:

Max index của adj là V - 1 thôi.

Với lại mất công xài vector rồi thì còn xài vector adj[V] làm gì, mà ở C++ nó có cho chơi như vầy đâu. :kissing:

#include <iostream>
#include <vector>

void addEdge(std::vector<std::vector<int>> &adj, int u, int v) {
    adj[u - 1].push_back(v - 1);
    adj[v - 1].push_back(u - 1);
}

void printGraph(std::vector<std::vector<int>> &adj) { 
    for (auto i : adj) {
        for (auto j : i) std::cout << j + 1 << ' ';
        std::cout << '\n';
    }
}

int main()  { 
    int V,E,a,b;
    std::cin >> V >> E;
    std::vector<std::vector<int>> adj(V);
    for(int i = 1; i <= E; ++i){
    	std::cin >> a >> b;
    	addEdge(adj, a, b);
	}
    printGraph(adj);
    return 0;
}
input
4 4
1 2
2 4
4 3
3 1
output
2 3 
1 4 
4 1 
2 3
4 Likes

Cảm ơn c nhiều nha, nhờ c mà được khai sáng rồi :smiley:

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