zoukankan      html  css  js  c++  java
  • BZOJ 2750 Road

    最短路+dp。

    #include<iostream>
    #include<cstdio>
    #include<cstring>
    #include<algorithm>
    #include<queue>
    #define maxv 1550
    #define maxe 10050
    #define inf 0x7f7f7f7f
    #define mod 1000000000
    using namespace std;
    struct edge
    {
        long long v,w,nxt,cnt;
    }e[maxe];
    long long n,m,x,y,z,nume=0,g[maxv],a[maxv],b[maxv],dis[maxv],cnt[maxv];
    bool vis[maxv];
    queue <long long> q;
    void addedge(long long u,long long v,long long w)
    {
        e[++nume].v=v;
        e[nume].w=w;
        e[nume].cnt=0;
        e[nume].nxt=g[u];
        g[u]=nume;
    }
    void reset1()
    {
        memset(a,0,sizeof(a));
        memset(b,0,sizeof(b));
        fill(dis+1,dis+n+1,inf);
        memset(vis,false,sizeof(vis));
    }
    void reset2(long long x)
    {
        memset(cnt,0,sizeof(cnt));
        memset(vis,false,sizeof(vis));
        a[x]=1;
    }
    void spfa(long long x)
    {
        while (!q.empty()) q.pop();
        q.push(x);vis[x]=true;dis[x]=0;
        while (!q.empty())
        {
            long long head=q.front();
            q.pop();vis[head]=false;
            for (long long i=g[head];i;i=e[i].nxt)
            {
                long long v=e[i].v;
                if (dis[v]>dis[head]+e[i].w)
                {
                    dis[v]=dis[head]+e[i].w;
                    if (!vis[v])
                    {
                        vis[v]=true;
                        q.push(v);
                    }
                }
            }
        }
    }
    void topu(long long x)
    {
        for (long long i=g[x];i;i=e[i].nxt)
        {
            long long v=e[i].v;
            if (dis[v]==dis[x]+e[i].w)
            {
                cnt[v]++;
                if (!vis[v]) 
                {
                    vis[v]=true;
                    topu(v);
                }
            }
        }
    }
    void get_a(long long x)
    {
        for (long long i=g[x];i;i=e[i].nxt)
        {
            long long v=e[i].v;
            if (dis[v]==dis[x]+e[i].w)
            {
                a[v]=(a[v]+a[x])%mod;
                if (--cnt[v]==0)
                    get_a(v);
            }
        }
    }
    void get_b(long long x)
    {
        b[x]=1;
        for (long long i=g[x];i;i=e[i].nxt)
        {
            long long v=e[i].v;
            if (dis[v]==dis[x]+e[i].w)
            {
                if (b[v]==0) get_b(v);
                b[x]=(b[x]+b[v])%mod;
            }
        }    
    }
    void bfs(long long x)
    {
        while (!q.empty()) q.pop();
        memset(vis,false,sizeof(vis));
        vis[x]=true;q.push(x);
        while (!q.empty())
        {
            long long head=q.front();q.pop();
            for (long long i=g[head];i;i=e[i].nxt)
            {
                long long v=e[i].v;
                if (dis[v]==dis[head]+e[i].w)
                {
                    e[i].cnt=(e[i].cnt+a[head]*b[v])%mod;
                    if (!vis[v])
                    {
                        vis[v]=true;
                        q.push(v);
                    }
                }
            }
        }
    }
    int main()
    {
        freopen("sss.in","r",stdin);
        freopen("sss.out","w",stdout);
        scanf("%lld%lld",&n,&m);
        for (long long i=1;i<=m;i++)
        {
            scanf("%lld%lld%lld",&x,&y,&z);
            addedge(x,y,z);
        }
        for (long long i=1;i<=n;i++)
        {
            reset1();
            spfa(i);
            reset2(i);
            topu(i);
            get_a(i);
            get_b(i);
            bfs(i);
        }
        for (long long i=1;i<=nume;i++)
            printf("%lld
    ",e[i].cnt%mod);
        return 0;
    }
  • 相关阅读:
    验证字符串空“” 的表达式
    should not this be a private conversation
    【转】你真的了解word-wrap 和 word-break 的区别吗
    To live is to function,that is all there is in living
    [转] windows 上用程序putty使用 ssh自动登录Linux(Ubuntu)
    Vim/gvim容易忘记的快捷键
    [转] Gvim for windows中块选择的方法
    问题集
    web services
    Trouble Shooting
  • 原文地址:https://www.cnblogs.com/ziliuziliu/p/5536980.html
Copyright © 2011-2022 走看看