记录下 最短路加上次短路的 个数的 模板(自己不会,只能背)
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<queue>
#include<string>
#include<cstring>
#include<iomanip>
#include<iostream>
#include<stack>
#include<cmath>
#include<map>
#include<vector>
#define ll long long
#define inf 0x3f3f3f3f
#define bug1 cout<<"bug1"<<endl;
#define bug2 cout<<"bug2"<<endl;
#define bug3 cout<<"bug3"<<endl;
using namespace std;
const int EM=1e4+10;
const int VM=1e3+10;
struct Edge{
int v,w,nxt;
}edge[EM];
int tol;
int dis[VM][2];
int vis[VM][2];
int cnt[VM][2];
int head[EM];
int n,m;
void addedge(int u,int v,int w){
edge[tol].v=v;
edge[tol].w=w;
edge[tol].nxt=head[u];
head[u]=tol++;
}
void djk(int src,int des){
memset(dis,inf,sizeof(dis));
memset(vis,0,sizeof(vis));
dis[src][0]=0;
cnt[src][0]=1;
for(int i=1;i<=n;++i){
}
int k,flag;
for(int i=1;i<=2*n-1;++i){
int tmp=inf;
for(int j=1;j<=n;++j){
if(!vis[j][0]&&tmp>dis[j][0]){
k=j;
flag=0;
tmp=dis[j][0];
}
if(!vis[j][1]&&tmp>dis[j][1]){
k=j;
flag=1;
tmp=dis[j][1];
}
}
if(tmp==inf)break;
vis[k][flag]=1;
for(int j=head[k];j!=-1;j=edge[j].nxt){
int v=edge[j].v;
int w=edge[j].w;
if(dis[v][0]>tmp+w){
dis[v][1]=dis[v][0];
cnt[v][1]=cnt[v][0];
dis[v][0]=tmp+w;
cnt[v][0]=cnt[k][0];
}
else if(dis[v][0]==tmp+w){
cnt[v][0]+=cnt[k][0];
}
else if(dis[v][1]>tmp+w){
dis[v][1]=tmp+w;
cnt[v][1]=cnt[k][flag];
}
else if(dis[v][1]==tmp+w){
cnt[v][1]+=cnt[k][flag];
}
}
}
if(dis[des][1]==dis[des][0]+1)
cnt[des][0]+=cnt[des][1];
printf("%d\n",cnt[des][0]);
}
int main(){
int t;
scanf("%d",&t);
while(t--){
tol=0;
memset(head,-1,sizeof(head));
scanf("%d%d",&n,&m);
int u,v,w;
while(m--){
scanf("%d%d%d",&u,&v,&w);
addedge(u,v,w);
}
int src,des;
scanf("%d%d",&src,&des);
djk(src,des);
}
}
417

被折叠的 条评论
为什么被折叠?



