次短路好算,这题多了个计数;
dp[u][1],dis[u][1]分别表示到u最短的路径条数和最短路的长度;
dp[u][2],dis[u][2]分别表示到u次短的路径条数和次短路的长度;
if (dis[u][kind] + cost[u][v] < dis[v][1]) 表示可以更新最短,那么同时次短也会被原来的最短所更新掉,产生了两个新状态,都要添加到队列中。
else if (dis[u][kind] + cost[u][v] == dis[v][1]) 表示最短路径增多了。
else if (dis[u][kind] + cost[u][v] < dis[v][2])表示可以更新次短路,状态有改变,需要将新状态添加到队列中。
else if (dis[u][kind] + cost[u][v] == dis[v][2])表示次短路径增多了。
const int maxn = 51;
int dis[maxn][3], dp[maxn][3], mark[maxn][3];
int n, m, st, ed;
struct node {
int u, dis, kind;
node() {}
node(int u,int dis,int kind) : u(u), dis(dis), kind(kind) {}
bool operator < (const node& rhs)