zoukankan      html  css  js  c++  java
  • POJ 1236 Network of Schools (强连通+缩点)

    ft........这个题开始想错了,无限WA,后来看了DIS才知道,自己完全错了,这个题做的很郁闷........努力啊

    不会Tarjan,丢人了,贴个连接,抓紧学习。

    http://www.byvoid.com/blog/scc-tarjan/

    #include <iostream>
    #include
    <cstdio>
    #include
    <algorithm>
    #include
    <memory.h>
    #include
    <cmath>
    #include
    <bitset>
    #include
    <queue>
    #include
    <vector>
    using namespace std;

    const int BORDER = (1<<20)-1;
    const int MAXSIZE = 37;
    const int MAXN = 205;
    const int INF = 1000000000;
    #define CLR(x,y) memset(x,y,sizeof(x))
    #define ADD(x) x=((x+1)&BORDER)
    #define IN(x) scanf("%d",&x)
    #define OUT(x) printf("%d\n",x)
    #define MIN(m,v) (m)<(v)?(m):(v)
    #define MAX(m,v) (m)>(v)?(m):(v)
    #define ABS(x) ((x)>0?(x):-(x))

    using namespace std;

    typedef
    struct{
    int v;
    int next;
    }Edge;

    Edge edge_p[MAXN
    *MAXN],edge_r[MAXN*MAXN];

    int n,m,k,ans,index_p,index_r,cnt,ret1,ret2;
    int net_p[MAXN],net_r[MAXN],order[MAXN],set[MAXN];
    int in_dg[MAXN],out_dg[MAXN];
    bool visit[MAXN];

    void add_edge(Edge* edge,int* net,const int& u,const int& v,int& index)
    {
    edge[index].v
    = v;
    edge[index].next
    = net[u];
    net[u]
    = index++;
    }
    int init()
    {
    index_r
    = index_p = 0;
    CLR(net_p,
    -1);
    CLR(net_r,
    -1);
    CLR(visit,
    0);
    CLR(order,
    0);
    CLR(
    set,0);
    CLR(in_dg,
    0);
    CLR(out_dg,
    0);
    return 0;
    }
    int input()
    {
    int tmp;
    for(int i = 1; i <= n; ++i)
    {
    for(int j = 0; ; ++j)
    {
    IN(tmp);
    if(!tmp)
    break;
    add_edge(edge_p,net_p,i,tmp,index_p);
    add_edge(edge_r,net_r,tmp,i,index_r);
    }
    }
    return 0;
    }
    void dfs_p(const int& u)
    {
    visit[u]
    = true;
    for(int i = net_p[u]; i != -1; i = edge_p[i].next)
    if(!visit[edge_p[i].v])
    dfs_p(edge_p[i].v);
    order[
    ++cnt] = u;
    }
    void dfs_r(const int& u)
    {
    visit[u]
    = true;
    set[u] = cnt;
    for(int i = net_r[u]; i != -1; i = edge_r[i].next)
    if(!visit[edge_r[i].v])
    dfs_r(edge_r[i].v);
    }
    int find_dg()
    {
    int i,j,tmp;
    ret1
    = ret2 = 0;
    for(i = 1; i <= n; ++i)
    for(j = net_p[i]; j != -1; j = edge_p[j].next)
    {
    if(set[i] != set[edge_p[j].v])
    {
    in_dg[
    set[edge_p[j].v]] = 1;
    out_dg[
    set[i]] = 1;
    }
    }
    for(i = 1; i <= cnt; ++i)
    {
    if(!in_dg[i])
    ++ret1;
    if(!out_dg[i])
    ++ret2;
    }
    return 0;
    }
    int work()
    {
    int i,j,tmp,u,v;
    CLR(visit,
    0);
    cnt
    = 0;
    for(i = 1; i <= n; ++i)
    if(!visit[i])
    dfs_p(i);
    CLR(visit,
    0);
    cnt
    = 0;
    for(i = n; i > 0; --i)
    if(!visit[order[i]])
    {
    ++cnt;
    dfs_r(order[i]);
    }
    find_dg();
    if(cnt == 1)
    printf(
    "1\n0\n");
    else
    printf(
    "%d\n%d\n",ret1,MAX(ret1,ret2));
    return 0;
    }
    int main()
    {
    while(IN(n)!=EOF)
    {
    init();
    input();
    work();
    }
    return 0;
    }

  • 相关阅读:
    怎么卸载Apache_pn服务PHPnow使用问题
    没有该栏目数据 可能缓存文件(data/cache/inc_catalog_base.inc)没有更新请检查是否有写入权限
    用css实现网页背景渐变
    为页面添加正确的doctype声明W3C标准
    js:全部替换的函数,用正则表达式解决,js的全部替换
    真够剽悍的——读罗永浩《我的奋斗》
    Auto你的IT——AutoIt是啥?
    书评:软件设计精要与模式
    程序员应知——破窗与童子军军规
    开发人员用的提交测试环境的AutoIT脚本
  • 原文地址:https://www.cnblogs.com/lvpengms/p/1722316.html
Copyright © 2011-2022 走看看