The Largest Clique UVA - 11324 (有向图最大团)

Posted yijiull

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了The Largest Clique UVA - 11324 (有向图最大团)相关的知识,希望对你有一定的参考价值。

The Largest Clique

 UVA - 11324 

题意:有向图最大团。求任意两点可达(不是互达)的最多点数。

先求出SCC,然后缩点,新图就变成了一个DAG,每个点的权值为内点的个数,用DP求解最大值。

技术分享
 1 #include <bits/stdc++.h>
 2 using namespace std;
 3 const int maxv=1010;
 4 
 5 int n,m;
 6 
 7 vector<int> G[maxv];
 8 int pre[maxv],lowlink[maxv],sccno[maxv],dfsk,scc_cnt;
 9 stack<int> s;
10 
11 void dfs(int u){
12     pre[u]=lowlink[u]=++dfsk;
13     s.push(u);
14     for(int i=0;i<G[u].size();i++){
15         int v=G[u][i];
16         if(!pre[v]){
17             dfs(v);
18             lowlink[u]=min(lowlink[u],lowlink[v]);
19         }
20         else if(!sccno[v]) lowlink[u]=min(lowlink[u],lowlink[v]);
21     }
22     if(lowlink[u]==pre[u]){
23         scc_cnt++;
24         for(;;){
25             int x=s.top();
26             s.pop();
27             sccno[x]=scc_cnt;
28             if(x==u) break;
29         }
30     }
31 }
32 void find_scc(int n){
33     memset(pre,0,sizeof(pre));
34     memset(lowlink,0,sizeof(lowlink));
35     memset(sccno,0,sizeof(sccno));
36     dfsk=scc_cnt=0;
37     for(int i=0;i<n;i++) if(!pre[i]) dfs(i);
38 }
39 
40 int sz[maxv],d[maxv],TG[maxv][maxv];  //DP
41 int dp(int u){
42     if(d[u]>0) return d[u];
43     d[u]=sz[u];
44     for(int i=1;i<=scc_cnt;i++)
45         if(TG[u][i]&&u!=i) d[u]=max(d[u],dp(i)+sz[u]);
46     return d[u];
47 }
48 int main(){
49     int t;
50     scanf("%d",&t);
51     while(t--){
52         scanf("%d%d",&n,&m);
53         for(int i=0;i<n;i++) G[i].clear();
54         int u,v;
55         for(int i=0;i<m;i++){
56             scanf("%d%d",&u,&v);
57             u--;v--;
58             G[u].push_back(v);
59         }
60         find_scc(n);
61 
62         //DP
63         memset(d,-1,sizeof(d));
64         memset(sz,0,sizeof(sz));
65         memset(TG,0,sizeof(TG));
66         for(int i=0;i<n;i++)
67         {
68             sz[sccno[i]]++;  //新图各点权重
69             for(int j=0;j<G[i].size();j++)
70             TG[sccno[i]][sccno[G[i][j]]]=1;  //新图
71         }
72         int ans=0;
73         for(int i=1;i<=scc_cnt;i++)
74             ans=max(ans,dp(i));
75         printf("%d\n",ans);
76     }
77 }
View Code

 

以上是关于The Largest Clique UVA - 11324 (有向图最大团)的主要内容,如果未能解决你的问题,请参考以下文章

UVA11324 The Largest Clique —— 强连通分量 + 缩点 + DP

The Largest Clique UVA - 11324 (有向图最大团)

UVA11324 The Largest Clique[强连通分量 缩点 DP]

UVa 11324 The Largest Clique (强连通分量+DP)

UVA 11324.The Largest Clique tarjan缩点+拓扑dp

UVA - 11324 The Largest Clique (强连通缩点+dp)