设为首页 加入收藏

TOP

最后的图不是强联通图(三)
2013-12-12 14:45:10 来源: 作者: 【 】 浏览:431
Tags:最后 不是 联通


    void tarjan(int now) {
    dfn[now] = low[now] = dp ++ ;
    st[tp ++ ] = now ;
    vis[now] = 1 ;
    for (int i = head[now] ; i != -1 ; i = ed[i].next ) {
    int v = ed[i].e ;
    if(dfn[v] == -1) {
    tarjan(v) ;
    //edn ++ ;
    low[now] = min(low[now],low[v]) ;
    } else if(vis[v]) {
    low[now] = min(low[now] ,dfn[v]) ;
    }
    }
    if(low[now] == dfn[now]) {
    int tt ;
    ca ++ ;
    do {
    tt = st[-- tp] ;
    vis[tt] = 0 ;
    belong[tt] = ca ;
    cnt[ca] ++ ;
    } while(tt != now) ;
    }
    }
    struct PP{
    int num , id ;
    }p[N] ;
    bool cmp(const PP& a ,const PP& b){
    return a.num > b.num ;
    }
    int main() {
    int T ;
    cin 》 T ;
    int cc = 0 ;
    while( T -- ) {
    cin 》 n 》 m ;
    init() ;
    for (int i = 0 ; i < m ; i ++ ) {
    int a,  b ;
    RD(a) ;
    RD(b) ;
    add(a , b) ;
    }
    for (int i = 1 ; i <= n ; i ++ ) {
    if(dfn[i] == -1)tarjan(i) ;
    }
    int bn = 0 ;
    for (int i = 1 ; i <= n ; i ++ ) {
    for (int j = head[i] ; ~j ; j = ed[j].next ) {
    int y = belong[ed[j].e] ;
    int x = belong[i] ;
    if(x != y) {
    br[bn].s = x ;
    br[bn ++].e = y ;
    out[x] ++ ;
    in[y] ++ ;
    }else {
    edg[x] ++ ;
    }
    }
    }
    printf("Case %d: ",++cc) ;
    ll ans = 0 ;
    if(ca == 1){
    puts("-1") ;
    }
    else {
    int numB = 0 ;
    for (int i = 0 ; i < bn ; i ++ ){
    int s = br[i].s ;
    int e = br[i].e ;
    BB[e] ++ ;
    }
    for (int i = 1 ; i <= ca ; i ++ ){
    if(out[i] == 0||in[i] == 0){//in[i] == 0 ,没有判断WA到死,我是SBSBSBSBSBSBSBSBSBSBSBSBSBSBSBSBSBSBSBBSBSB
    int nowP = n - cnt[i] ;//除该分量外其他所有的点数
    int nowE = m - edg[i] - BB[i];//除该分量以外所有的边数
    ll sum = (ll)(nowP - 1) * (ll)nowP - nowE ;//连接除i外所有的分量
    sum += (ll)nowP * (ll)cnt[i] - BB[i] ;//连接完分量之后和i连接
    sum += (ll)cnt[i] * (ll)(cnt[i] - 1) - edg[i] ;//i分量内所有的点都连起来
    ans = max(ans ,sum) ;
    }
    }
    cout 《 ans 《 endl;
    }
    }
    return 0 ;
    }

      

首页 上一页 1 2 3 4 5 下一页 尾页 3/5/5
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇C++后缀数组练习题 下一篇区间动态规划定义区间DP

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容:

·Libevent C++ 高并发 (2025-12-26 00:49:30)
·C++ dll 设计接口时 (2025-12-26 00:49:28)
·透彻理解 C 语言指针 (2025-12-26 00:22:52)
·C语言指针详解 (经典 (2025-12-26 00:22:49)
·C 指针 | 菜鸟教程 (2025-12-26 00:22:46)