BZOJ 2750 Road

Posted on 2016-05-28 11:04  ziliuziliu  阅读(121)  评论(0编辑  收藏  举报

最短路+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\n",e[i].cnt%mod);
    return 0;
}