# 图论--最大势
# 说明
- 最大势算法:求弦图的完美消除序列算法
# 使用
- 创建数据结构: GPPF
- 建图成功后调用
GPPF::solve()
# Tips
# 代码
struct GPPF{
#define mp make_pair
#define irange(i, arr) for(auto&i:arr)
#define range(i, a, b) for(auto i=a;i<=b;++i)
#define pi pair<int,int>
static const int mxn = 1e5+5;
bool vis[mxn], use[mxn];
int n,m,ans,cnt[mxn];
vector<int>G[mxn];
GPPF(int n,int m):n(n),m(m){
range(i,1,m){
int u,v;
cin>>u>>v;
G[u].push_back(v);
G[v].push_back(u);
}
}
void solve(){
priority_queue<pi > q;
range(i, 1, n)q.push(mp(0, i));
while (!q.empty()) {
while(!q.empty() and vis[q.top().second])q.pop();
if(q.empty())break;
int u = q.top().second;
q.pop();
vis[u] = true;
if(not use[cnt[u]]){
++ans;
use[cnt[u]] = true;
}
irange(i,G[u]){
if(vis[i])continue;
++cnt[i];
q.push(mp(cnt[i],i));
}
}
cout<<ans<<'\n';
}
};
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
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