解题思路:嗯这种写法逻辑比较清楚,适合做模板。再来解释一下以下方法做出来的次短路是一定大于最短路的。
#include<vector>
#include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
#define inf 0x3f3f3f3f
using namespace std;
struct node
{
int v,w;
node(int v,int w):v(v),w(w){}
node(){}
};
int st,ed,n,m;
vector<node> s[1005];
int dis[2][1005],vis[2][1005],dp[2][1005];
void djk()
{
int k,r;
node p;
for(int i=1;i<=n;i++)
{
dis[0][i]=dis[1][i]=inf;
}
memset(vis,0,sizeof(vis));
memset(dp,0,sizeof(dp));
dp[0][st]=1;
dis[0][st]=0;
for(int i=0;i<2*n;i++)
{
int mi=inf;
k=-1;
for(int j=1;j<=n;j++)
{
if(!vis[0][j]&&dis[0][j]<mi)
{
mi=dis[0][j];
k=j;
r=0;
}else
if(!vis[1][j]&&dis[1][j]<mi)
{
mi=dis[1][j];
k=j;
r=1;
}
}
if(k==-1) break;
vis[r][k]=1;
for(int j=0;j<s[k].size();j++)
{
p=s[k][j];
int v=p.v,w=p.w;
if(!vis[0][v]&&dis[r][k]+w<dis[0][v])
{
if(dis[0][v]!=inf)
{
dis[1][v]=dis[0][v];
dp[1][v]=dp[0][v];
}
dis[0][v]=dis[r][k]+w;
dp[0][v]=dp[r][k];
}else
if(!vis[0][v]&&dis[r][k]+w==dis[0][v])
{
dp[0][v]+=dp[r][k];
}else
if(!vis[1][v]&&dis[r][k]+w<dis[1][v])
{
dis[1][v]=dis[r][k]+w;
dp[1][v]=dp[r][k];
}else
if(!vis[1][v]&&dis[r][k]+w==dis[1][v])
{
dp[1][v]+=dp[r][k];
}
}
}
//cout<<dis[0][ed]<<" "<<dis[1][ed]<<endl;
printf("%d\n",dis[1][ed]-dis[0][ed]==1?dp[1][ed]+dp[0][ed]:dp[0][ed]);
}
int main()
{
freopen("t.txt","r",stdin);
int T,a,b,c;
scanf("%d",&T);
while(T--)
{
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++)
s[i].clear();
while(m--)
{
scanf("%d%d%d",&a,&b,&c);
s[a].push_back(node(b,c));
}
scanf("%d%d",&st,&ed);
djk();
}
return 0;
}