您的位置:首页 > 其它

uva 11324

2013-12-14 20:02 274 查看
这是有向图的最大团问题 ,  解决方法是:先求出scc的dag图,
再用dag动态规划来求最大团

#include

#include

#include

#include

#include

#include

using namespace std;

const int MAXN = 1100 ;

int pre[MAXN] , lowlink[MAXN] , sccno[MAXN] ;

int n = 0, m = 0, dfs_clock = 0, scc_cnt = 0 , vis[MAXN];

vector grap[MAXN] ;

stack s;

int d[MAXN] , scc_sum[MAXN];

int DAG[MAXN][MAXN];

void dfs(int u)

{

    lowlink[u] =
pre[u] = ++dfs_clock ;

   
s.push(u);

    for(int i =
0 ; i < grap[u].size() ; i++)

    {

   
    int v =
grap[u][i] ;

   
   
if(!pre[v])

   
    {

   
   
    dfs(v)
;

   
   
   
 lowlink[u] = min( lowlink[v] , lowlink[u]
);

   
    }

   
    else
if(!sccno[v])

   
    {

   
   
   
  lowlink[u] = min(lowlink[u] , pre[v]) ;
//在这里不是和lowlink[v]比较 ,是因为此时lowlink[v] == pre[v] 。

   
   
    //
因为v这个点首先不属于其他任何一个强连通分量 , 所以就可以判断出v和u是的祖先 。 就是说dfs是先到达v , 然后再从v来到了u


   
    }

    }

   
if(lowlink[u] == pre[u]) 

    {

   
   
scc_cnt++;

   
    for(;
;)

   
    {

   
   
    int x =
s.top();

   
   
    s.pop()
;

   
   
    sccno[x] =
scc_cnt;

   
   
//    sum +=
1;

   
   
    if(x ==
u)  break;

   
    }

   
//   
scc_sum[scc_cnt] = sum ;

    }

}

void find_scc()

{

    memset(pre ,
0 , sizeof(pre));

   
memset(lowlink , 0 , sizeof(lowlink));

    memset(sccno
, 0 , sizeof(sccno));

   
memset(scc_sum , 0 , sizeof(scc_sum));

    memset(vis ,
0 , sizeof(vis));

    dfs_clock =
scc_cnt = 0 ;

    for(int i =
1; i <= n; i++)

   
   
if(!pre[i])  dfs(i);

}

int dp(int v)



      

       
if(d[v]) return d[v]; 

       
int Max = 0; 

       
for(int i = 1;i <= scc_cnt;i++) 

   
   
   
if(DAG[v][i])

   
 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: