3 3 0 2 0 2 5 0 1 4 1 2 2
6 1
#include<map>
#include<queue>
#include<stack>
#include<ctime>
#include<cctype>
#include<cstdio>
#include<cstring>
#include<string>
#include<iostream>
#include<algorithm>
using namespace std;
typedef long long ll;
const int maxn = 50 + 5;
const int max_dis = 1e9;
struct Edge{
int to;
int dis;
Edge(int to,int dis){
this -> to = to;
this -> dis = dis;
}
};
struct Node{
int d;
int v;
int pose; // 0 代表最短路 1 代表次短路
friend bool operator<(Node x,Node y){
if(x.d==y.d) return x.v>y.v;
return x.d>y.d;
}
};
int N,M,S,E,a,b,c;
bool vis[maxn][2];
int dist[maxn][2];
int degree[maxn][2];
vector<Edge>G[maxn];
void dij(int s,int e){
for(int i=0;i<maxn;i++){
dist[i][0]=dist[i][1]=max_dis;
degree[i][0]=degree[i][1]=0;
vis[i][0]=vis[i][1]=false;
}
priority_queue<Node>q;
while(q.size()) q.pop();
Node p,w;
p.d=0; p.v=s; p.pose=0;
degree[p.v][p.pose]=1;
q.push(p);
while(q.size()){
p=q.top(); q.pop();
if(vis[p.v][p.pose]) continue;
vis[p.v][p.pose]=true;
for(int i=0;i<G[p.v].size();i++){
Edge& e=G[p.v][i];
if(!vis[e.to][0]&&p.d+e.dis<dist[e.to][0]){ //找到一条比当前最短路更短的路
if(dist[e.to][0]!=max_dis){ //作为次短路,入队
w.v=e.to; w.d=dist[e.to][0]; w.pose=1;
dist[e.to][1]=dist[e.to][0];
degree[e.to][1]=degree[e.to][0];
q.push(w);
}
w.v=e.to; w.d=p.d+e.dis; w.pose=0; //更新最短路,入队
dist[e.to][0]=w.d; degree[e.to][0]=degree[p.v][p.pose];
q.push(w);
}
else if(!vis[e.to][0]&&p.d+e.dis==dist[e.to][0]){ //找到一条相同距离的最短路,更新条数,不入队
degree[e.to][0]+=degree[p.v][p.pose];
}
else if(!vis[e.to][1]&&p.d+e.dis<dist[e.to][1]){ //找到一条比当前次短路更短的路,不可以更新最短路,可更新次短路,入队
w.v=e.to; w.d=p.d+e.dis; w.pose=1;
dist[e.to][1]=w.d; degree[e.to][1]=degree[p.v][p.pose];
q.push(w);
}
else if(!vis[e.to][1]&&p.d+e.dis==dist[e.to][1]){ //找到一条相同距离的次短路,更新条数,不入队
degree[e.to][1]+=degree[p.v][p.pose];
}
}
}
}
int main(){
while(scanf("%d%d%d%d",&N,&M,&S,&E)!=EOF){
for(int i=0;i<maxn;i++) G[i].clear();
for(int i=0;i<M;i++){
scanf("%d%d%d",&a,&b,&c);
G[a].push_back(Edge(b,c));
}
dij(S,E);
printf("%d %d\n",dist[E][1],degree[E][1]);
}return 0;
}
HDU_3191_How Many Paths Are There
原文地址:http://blog.csdn.net/jhgkjhg_ugtdk77/article/details/45081019