PAT (Advanced Level) Practice 用到圖的存儲方式,但沒有用到圖的算法的題目ios
n != queryV.size()
檢查是否 query 覆蓋了全部結點kn != n + 1
檢查 query 是否多走或少走query[0] != query[kn-1]
檢查是否成環#include<iostream> #include<unordered_set> using namespace std; bool G[201][201] = {false}; int main() { int n, m, u, v, k, kn; scanf("%d%d", &n, &m); for (int i = 0; i < m; i++){ scanf("%d%d", &u, &v); G[u][v] = G[v][u] = true; } scanf("%d", &k); for (int i = 0; i < k; i++){ scanf("%d", &kn); int query[kn]; unordered_set<int> queryV; for (int j = 0; j < kn; j++){ scanf("%d", &query[j]); queryV.insert(query[j]); } bool isC = true; for (int j = 0; j < kn - 1; j++) if (!G[query[j]][query[j+1]]) isC = false; if (!isC || kn != n + 1 || n != queryV.size() || query[0] != query[kn-1]) printf("NO\n"); else printf("YES\n"); } return 0; }
Adj[i].size()
)表示每一個結點的度#include<iostream> #include<vector> #include<queue> using namespace std; vector<int> Adj[501]; bool vis[501] = {false}; int connected = 0; void DFS(int root){ connected++; vis[root] = true; for (int i = 0; i < Adj[root].size(); i++) if (!vis[Adj[root][i]]) DFS(Adj[root][i]); } int main() { int n, m, u, v, oddnum = 0; scanf("%d%d", &n, &m); for (int i = 0; i < m; i++){ scanf("%d%d", &u, &v); Adj[u].push_back(v); Adj[v].push_back(u); } DFS(1); for (int i = 1; i < n + 1; i++){ printf("%d%c", Adj[i].size(), i == n ? '\n' : ' '); if (Adj[i].size() % 2) oddnum++; } if (connected != n) printf("Non-Eulerian\n"); else printf("%s\n", !oddnum ? "Eulerian" : oddnum == 2 ? "Semi-Eulerian" : "Non-Eulerian"); return 0; }
#include<iostream> #include<vector> #include<queue> using namespace std; int G[501][501] = {0}; bool vis[501] = {false}; int main() { int n, m, u, v, connected = 0, oddnum = 0; scanf("%d%d", &n, &m); int degree[n+1] = {0}; for (int i = 0; i < m; i++){ scanf("%d%d", &u, &v); degree[u]++; degree[v]++; G[u][v] = G[v][u] = 1; } queue<int> q; q.push(n); vis[n] = true; while (!q.empty()){ int now = q.front(); q.pop(); connected++; for (int i = 1; i < n + 1; i++){ if (!vis[i] && G[now][i]){ q.push(i); vis[i] = true; } } } for (int i = 1; i < n + 1; i++){ printf("%d%c", degree[i], i == n ? '\n' : ' '); if (degree[i] % 2) oddnum++; } if (connected != n) printf("Non-Eulerian\n"); else printf("%s\n", !oddnum ? "Eulerian" : oddnum == 2 ? "Semi-Eulerian" : "Non-Eulerian"); return 0; }
vector<pair<int,int>>
保存邊的端點#include<iostream> #include<vector> #include<unordered_map> using namespace std; int main() { int n, m, k, nv, v; scanf("%d%d", &n, &m); vector<pair<int,int>> edges(m); for (int i = 0; i < m; i++) scanf("%d%d", &edges[i].first, &edges[i].second); scanf("%d", &k); for (int i = 0; i < k; i++){ scanf("%d", &nv); unordered_map<int,bool> vertex; bool iscover = true; for (int j = 0; j < nv; j++){ scanf("%d", &v); vertex[v] = true; } for (int j = 0; j < m; j++){ if (!vertex[edges[j].first] && !vertex[edges[j].second]){ iscover = false; break; } } printf("%s\n", iscover ? "Yes" : "No"); } return 0; }
isclique
& isMax
均設爲 true
,新建保存序列的數組和保存序列結點的集合#include<iostream> #include<set> using namespace std; bool G[201][201] = {false}; int main() { int nv, ne, u, v, m, K; scanf("%d%d", &nv, &ne); for (int i = 0; i < ne; i++){ scanf("%d%d", &u, &v); G[u][v] = G[v][u] = true; } scanf("%d", &m); for (int i = 0; i < m; i++){ bool isclique = true, isMax = true; scanf("%d", &K); int clique[K]; set<int> cliqueV; for (int j = 0; j < K; j++){ scanf("%d", &clique[j]); cliqueV.insert(clique[j]); } for (int j = 0; j < K - 1; j++){ for (int k = j + 1; k < K; k++){ if (!G[clique[j]][clique[k]]){ isclique = false; printf("Not a Clique\n"); break; } } if (!isclique) break; } if (isclique){ for (int j = 1; j <= nv; j++){ if (cliqueV.find(j) == cliqueV.end()){ for (int k = 0; k < K; k++){ if (!G[clique[k]][j]) break; if (k == K - 1) isMax = false; } } if (!isMax){ printf("Not Maximal\n"); break; } } if (isMax) printf("Yes\n"); } } return 0; }
vector<pair<int,int>>
保存全部邊#include<iostream> #include<vector> #include<set> using namespace std; int main() { int n, m, k, u, v; scanf("%d%d", &n, &m); vector<pair<int,int>> edges(m); for (int i = 0; i < m; i++) scanf("%d%d", &edges[i].first, &edges[i].second); scanf("%d", &k); for (int i = 0; i < k; i++){ vector<int> colors(n); set<int> coloring; bool isokay = true; for (int j = 0; j < n; j++){ scanf("%d", &colors[j]); coloring.insert(colors[j]); } for (int j = 0; j < m; j++) if (colors[edges[j].first] == colors[edges[j].second]) isokay = false; if (!isokay) printf("No\n"); else printf("%d-coloring\n", coloring.size()); } return 0; }