最短路径条数
问题传送门:P1144 P1608
int tot ;
int head[MAXN], nxt[MAXN], to[MAXN], w[MAXN] ;
int cnt[MAXN] ;
void add_edge(int x, int y, int z)
{
to[++tot] = y ;
w[tot] = z ;
nxt[tot] = head[x] ;
head[x] = tot ;
}
std::priority_queue<std::pii> q ;
int dis[MAXN] ;
int vis[MAXN] ;
void init()
{
for(int i = 1 ; i <= n ; i ++ ) dis[i] = 0x3f3f3f3f , vis[i] = 0 ;
}
void dijstra(int x)
{
init() ;
cnt[x] = 1 ;
dis[x] = 0 ;
q.push(std::make_pair(0, x)) ;
while(!q.empty())
{
int u = q.top().second ;
q.pop() ;
if(vis[u] == 1) continue ;
vis[u] = 1 ;
for(int i = head[u] ; i ; i = nxt[i] )
{
int v = to[i] ;
if(dis[v] > dis[u] + w[i])
{
cnt[v] = cnt[u] ;
dis[v] = dis[u] + w[i] ;
q.push(std::make_pair(-dis[v], v)) ;
}
else if(dis[v] == dis[u] + w[i])
{
cnt[v] += cnt[u] ;
cnt[v] MOD ;
}
}
}
}