BZOJ 2750 Road
Posted ziliuziliu
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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\n",e[i].cnt%mod); return 0; }
以上是关于BZOJ 2750 Road的主要内容,如果未能解决你的问题,请参考以下文章
BZOJ 2750 HAOI 2012 Road 高速公路 最短路