题目大意:
求次短路,以及次短路的条数,给出的图中没有环。
解题思路:
一开始的时候A*+spfa竟然超时了,后来看了别人的思路,是直接找最短路和次短路,dp数组记录所有点最短路和次短路路径的数目。
#include<stdio.h>
#include<string.h>
#define N 60
const int inf = 1<<31-1;
int mp[N][N];
int dis[2][N],dp[2][N];
bool visit[2][N];
void initi(int n)
{
int i,j;
for(i=0;i<=n;i++)
{
dp[0][i]=dp[1][i]=0;
dis[0][i]=dis[1][i]=inf;
visit[0][i]=visit[1][i]=false;
for(j=0;j<=n;j++)
mp[i][j]=inf;
}
}
void dijkstra(int st,int ed,int n)
{
int i,mdis,ui,j,k;
dis[0][st]=dis[1][st]=0;
dp[0][st]=1;
for(i=0;i<2*n;i++)
{
k=-1;
mdis=inf;
for(j=0;j<n;j++)
{
if(!visit[0][j]&&dis[0][j]<mdis)
{
mdis=dis[0][j];
ui=j;
k=0;
}
else if(!visit[1][j]&&dis[1][j]<mdis)
{
mdis=dis[1][j];
ui=j;
k=1;
}
}
if(k==-1)
break;
visit[k][ui]=true;
for(j=0;j<n;j++)
{
if(mdis+mp[ui][j]<dis[0][j])
{
dis[1][j]=dis[0][j];
dp[1][j]=dp[0][j];
dp[0][j]=dp[k][ui];
dis[0][j]=mdis+mp[ui][j];
}
else if(mdis+mp[ui][j]==dis[0][j])
{
dp[0][j]+=dp[k][ui];
}
else if(mdis+mp[ui][j]<dis[1][j])
{
dp[1][j]=dp[k][ui];
dis[1][j]=mdis+mp[ui][j];
}
else if(mdis+mp[ui][j]==dis[1][j])
{
dp[1][j]+=dp[k][ui];
}
}
}
}
int main()
{
int n,m,s,e;
int a,b,d;
//void initi(int n);
//void dijkstra(int st,int ed,int n);
while(scanf("%d%d%d%d",&n,&m,&s,&e)!=EOF)
{
initi(n);
while(m--)
{
scanf("%d%d%d",&a,&b,&d);
mp[a][b]=d;
}
dijkstra(s,e,n);
printf("%d %d\n",dis[1][e],dp[1][e]);
}
}