// Przyjąłem zasadę, żeby walczyć do końca czasu. // Tym razem (znów) się nie udało. #include <iostream> #include <vector> #include <queue> #include <set> using namespace std; void add_edge(vector<int> adj[], int u, int v) { adj[u].push_back(v); adj[v].push_back(u); } void print_graph(vector<int> adj[], int V) { for (int v = 0; v < V; ++v) { cout << "vertex " << v << " "; for (int i = 0; i < adj[v].size(); i++) cout << " -> " << adj[v][i]; printf("\n"); } printf("\n"); } std::vector<std::vector<int> > get_diff_graph(const std::vector<int> adj1[], const std::vector<int> adj2[], int n) { std::vector<std::vector<int> > diff_graph(n); std::set<int> adj2Set[n]; // Tworzenie zbiorów dla każdego wierzchołka w adj2 for (int i = 0; i < n; i++) { for (int k = 0; k < adj2[i].size(); k++) { int j = adj2[i][k]; adj2Set[i].insert(j); } } // Dodawanie krawędzi, które istnieją w adj1, ale nie w adj2 for (int i = 0; i < n; i++) { for (int k = 0; k < adj1[i].size(); k++) { int j = adj1[i][k]; if (adj2Set[i].find(j) == adj2Set[i].end()) { diff_graph[i].push_back(j); diff_graph[j].push_back(i); } } } return diff_graph; } vector<int> find_path(vector<int> adj[], int nod_cnt, int v_start, int v_end) { vector<bool> visited(nod_cnt, false); vector<int> prevs(nod_cnt, -1); queue<int> que; que.push(v_start); visited[v_start] = true; // Przeszukiwanie wszerz while (!que.empty()) { int cur = que.front(); que.pop(); // Sprawdzamy sąsiednie wierzchołki for (vector<int>::iterator iter = adj[cur].begin(); iter != adj[cur].end(); iter++) { int neighbor = *iter; if (!visited[neighbor]) { que.push(neighbor); visited[neighbor] = true; prevs[neighbor] = cur; } } } // Tworzymy ścieżkę od końca do początku vector<int> path; int cur = v_end; while (cur != -1) { path.push_back(cur); cur = prevs[cur]; } return path; } int main() { int n; std::ios_base::sync_with_stdio(false); std::cin.tie(NULL); cin >> n; vector<int> adj_src[n]; vector<int> adj_dest[n]; int m_src; cin >> m_src; for (int i = 0; i < m_src; i++) { int u, v; cin >> u >> v; add_edge(adj_src, u - 1, v - 1); } int m_dest; cin >> m_dest; for (int i = 0; i < m_dest; i++) { int u, v; cin >> u >> v; add_edge(adj_dest, u - 1, v - 1); } // cout << "Graf (źródłowy):\n"; // print_graph(adj_src, n); // cout << "Graf (docelowy):\n"; // print_graph(adj_dest, n); std::vector<std::vector<int> > diff_graph = get_diff_graph(adj_dest, adj_src, n); vector<int> adj_dest_not_src[n]; for (int i = 0; i < n; i++) { adj_dest_not_src[i].resize(diff_graph[i].size()); for (int j = 0; j < diff_graph[i].size(); j++) adj_dest_not_src[i][j] = diff_graph[i][j]; } // TODO: :) // cout << "Graf (różnica):\n"; // print_graph(adj_dest_not_src, n); // // system("pause"); return 0; }
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 | // Przyjąłem zasadę, żeby walczyć do końca czasu. // Tym razem (znów) się nie udało. #include <iostream> #include <vector> #include <queue> #include <set> using namespace std; void add_edge(vector<int> adj[], int u, int v) { adj[u].push_back(v); adj[v].push_back(u); } void print_graph(vector<int> adj[], int V) { for (int v = 0; v < V; ++v) { cout << "vertex " << v << " "; for (int i = 0; i < adj[v].size(); i++) cout << " -> " << adj[v][i]; printf("\n"); } printf("\n"); } std::vector<std::vector<int> > get_diff_graph(const std::vector<int> adj1[], const std::vector<int> adj2[], int n) { std::vector<std::vector<int> > diff_graph(n); std::set<int> adj2Set[n]; // Tworzenie zbiorów dla każdego wierzchołka w adj2 for (int i = 0; i < n; i++) { for (int k = 0; k < adj2[i].size(); k++) { int j = adj2[i][k]; adj2Set[i].insert(j); } } // Dodawanie krawędzi, które istnieją w adj1, ale nie w adj2 for (int i = 0; i < n; i++) { for (int k = 0; k < adj1[i].size(); k++) { int j = adj1[i][k]; if (adj2Set[i].find(j) == adj2Set[i].end()) { diff_graph[i].push_back(j); diff_graph[j].push_back(i); } } } return diff_graph; } vector<int> find_path(vector<int> adj[], int nod_cnt, int v_start, int v_end) { vector<bool> visited(nod_cnt, false); vector<int> prevs(nod_cnt, -1); queue<int> que; que.push(v_start); visited[v_start] = true; // Przeszukiwanie wszerz while (!que.empty()) { int cur = que.front(); que.pop(); // Sprawdzamy sąsiednie wierzchołki for (vector<int>::iterator iter = adj[cur].begin(); iter != adj[cur].end(); iter++) { int neighbor = *iter; if (!visited[neighbor]) { que.push(neighbor); visited[neighbor] = true; prevs[neighbor] = cur; } } } // Tworzymy ścieżkę od końca do początku vector<int> path; int cur = v_end; while (cur != -1) { path.push_back(cur); cur = prevs[cur]; } return path; } int main() { int n; std::ios_base::sync_with_stdio(false); std::cin.tie(NULL); cin >> n; vector<int> adj_src[n]; vector<int> adj_dest[n]; int m_src; cin >> m_src; for (int i = 0; i < m_src; i++) { int u, v; cin >> u >> v; add_edge(adj_src, u - 1, v - 1); } int m_dest; cin >> m_dest; for (int i = 0; i < m_dest; i++) { int u, v; cin >> u >> v; add_edge(adj_dest, u - 1, v - 1); } // cout << "Graf (źródłowy):\n"; // print_graph(adj_src, n); // cout << "Graf (docelowy):\n"; // print_graph(adj_dest, n); std::vector<std::vector<int> > diff_graph = get_diff_graph(adj_dest, adj_src, n); vector<int> adj_dest_not_src[n]; for (int i = 0; i < n; i++) { adj_dest_not_src[i].resize(diff_graph[i].size()); for (int j = 0; j < diff_graph[i].size(); j++) adj_dest_not_src[i][j] = diff_graph[i][j]; } // TODO: :) // cout << "Graf (różnica):\n"; // print_graph(adj_dest_not_src, n); // // system("pause"); return 0; } |