PAT甲级1142 Maximal Clique :[C++题解]图论、最大团、枚举
生活随笔
收集整理的這篇文章主要介紹了
PAT甲级1142 Maximal Clique :[C++题解]图论、最大团、枚举
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
文章目錄
- 題目分析
- 題目鏈接
題目分析
來源:acwing
分析:
團:團是頂點的集合,滿足該集合中任意兩頂點之間都有邊。
判斷是不是團:所有點是否有邊
判斷最大團:是否可以加一個額外點,使得所有點之間都有邊。
數據較小,直接O(n^2)暴力可以過。
開鄰接矩陣標志存在邊。判斷團:二重循環遍歷給定的點,判斷是否存在邊。
判斷最大團:二重循環遍歷添加進來新的點,看看新點是否和集合內的點都兩兩存在邊,如果存在沒有邊的情況,就不是最大團。
AC代碼
#include<bits/stdc++.h> using namespace std; const int N =300;int n, m; bool g[N][N],st[N]; int ver[N];bool check_clique(int cnt){for(int i =0; i< cnt ;i++)for(int j =0; j<i ;j++)//沒有邊if(!g[ver[i]][ver[j]]) return false;return true; }bool check_maximum(int cnt){memset(st, 0 ,sizeof st);//集合內的點做好標記for(int i =0; i< cnt; i++)st[ver[i]] =true;//遍歷集合外的點for(int i =1; i<= n; i++){if(!st[i]){bool success = true;//遍歷集合內的點:看是否存在邊for(int j = 0; j< cnt; j++){if(!g[i][ver[j]]){success =false;break;}}if(success) return false; //不是最大團}}return true; } int main(){cin >> n >> m;while(m--){int a, b;cin >> a >> b;g[a][b] =g[b][a] =true;}int k;cin >> k;while(k--){int cnt;cin >> cnt;//讀入頂點for(int i = 0; i<cnt; i++) cin >> ver[i]; if(check_clique(cnt)) {if(check_maximum(cnt)) cout<<"Yes"<<endl;else cout<<"Not Maximal"<<endl;}else cout<<"Not a Clique"<<endl;} }題目鏈接
PAT甲級1142 Maximal Clique
https://www.acwing.com/problem/content/1637/
總結
以上是生活随笔為你收集整理的PAT甲级1142 Maximal Clique :[C++题解]图论、最大团、枚举的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: PAT甲级1139 First Cont
- 下一篇: PAT甲级1146 Topologica