最短路相关问题

最短路径条数

问题传送门: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 ;
            }
		}
	}
}
posted @ 2023-04-19 20:14  Lwen1243  阅读(9)  评论(0)    收藏  举报