#include <stdio.h> #include <vector> #include <queue> #include <algorithm> using namespace std; struct vertex{ int type; bool visited; vector<int> neighbors; }; vector<vertex> graph; int sum; int dfs(int root){ int sub_graph; if(graph[root].visited) return 0; graph[root].visited = true; int longestPath = 1; for(int i = 0; i < graph[root].neighbors.size(); i++){ sub_graph = dfs(graph[root].neighbors[i]); longestPath = max(sub_graph+1, longestPath); } return longestPath; } int main(void){ int t, n, k, result; bool can_be_achieved; vector<int> toy_n; scanf("%d", &t); for(int day = 0; day < t; day++){ scanf("%d", &n); toy_n.resize(n); sum = 0; for(int i = 0; i < n; i++){ scanf("%d", &k); toy_n[i] = k; sum += k; } graph.resize(sum); for(int i = 0; i < sum; i++) graph[i].neighbors.clear(); k = 0; // wierzchołki mają swój typ for(int i = 0; i < n; i++){ for(int j = 0; j < toy_n[i]; j++, k++){ graph[k].type = i; } } //stwórz graf, tż dwa wierzchołki są połączone, gdy róznią się typem o 1 for(int i = 0; i < sum; i++){ for(int j = 0; j < sum; j++){ if(graph[i].type -1 == graph[j].type){ graph[i].neighbors.push_back(j); graph[j].neighbors.push_back(i); } } } can_be_achieved = false; //wypisz wyniki przeszukiwania grafu wszerz - wybierz jeden z wierzchołków danego typu i od niego zaczynaj for(int i = 0, j = 0; i < sum; i+=toy_n[j], j++){ for(k = 0; k < sum; k++) graph[k].visited = false; result = dfs(i); //printf("%d dla wierzchołka typu %d\n", result, j); if(result == sum) { can_be_achieved = true; break; } } if(can_be_achieved) printf("TAK\n"); else printf("NIE\n"); } 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 | #include <stdio.h> #include <vector> #include <queue> #include <algorithm> using namespace std; struct vertex{ int type; bool visited; vector<int> neighbors; }; vector<vertex> graph; int sum; int dfs(int root){ int sub_graph; if(graph[root].visited) return 0; graph[root].visited = true; int longestPath = 1; for(int i = 0; i < graph[root].neighbors.size(); i++){ sub_graph = dfs(graph[root].neighbors[i]); longestPath = max(sub_graph+1, longestPath); } return longestPath; } int main(void){ int t, n, k, result; bool can_be_achieved; vector<int> toy_n; scanf("%d", &t); for(int day = 0; day < t; day++){ scanf("%d", &n); toy_n.resize(n); sum = 0; for(int i = 0; i < n; i++){ scanf("%d", &k); toy_n[i] = k; sum += k; } graph.resize(sum); for(int i = 0; i < sum; i++) graph[i].neighbors.clear(); k = 0; // wierzchołki mają swój typ for(int i = 0; i < n; i++){ for(int j = 0; j < toy_n[i]; j++, k++){ graph[k].type = i; } } //stwórz graf, tż dwa wierzchołki są połączone, gdy róznią się typem o 1 for(int i = 0; i < sum; i++){ for(int j = 0; j < sum; j++){ if(graph[i].type -1 == graph[j].type){ graph[i].neighbors.push_back(j); graph[j].neighbors.push_back(i); } } } can_be_achieved = false; //wypisz wyniki przeszukiwania grafu wszerz - wybierz jeden z wierzchołków danego typu i od niego zaczynaj for(int i = 0, j = 0; i < sum; i+=toy_n[j], j++){ for(k = 0; k < sum; k++) graph[k].visited = false; result = dfs(i); //printf("%d dla wierzchołka typu %d\n", result, j); if(result == sum) { can_be_achieved = true; break; } } if(can_be_achieved) printf("TAK\n"); else printf("NIE\n"); } return 0; } |