1⃣️int数组的默认值为0,所以={0}这个加不加都一样,如果a[100]={1},表示a[0]=1,其余都是0,可以用fill函数,例如:
fill(d,d+MAXN,INF);
2⃣️dijkstra模板当最小距离一样时,可以添加点权,第二边权,路径数量。
#include<iostream>
using namespace std;
const int MAXN=510;
const int INF=100000000;
int n,e,st,ed,G[MAXN][MAXN],weight[MAXN];
int d[MAXN],w[MAXN]={0},num[MAXN]={0};
bool vis[MAXN]={false};
void dijkstra(int s){
d[s]=0;
w[s]=weight[s];
num[s]=1;
for(int i=0;i<n;i++){
int u=-1,min=INF;
for(int j=0;j<n;j++){
if(vis[j]==false&&d[j]<min){
min=d[j];
u=j;
}
}
if(u==-1) return;
vis[u]=true;
for(int v=0;v<n;v++){
if(vis[v]==false&&G[u][v]!=INF){
if(d[u]+G[u][v]<d[v]){
d[v]=d[u]+G[u][v];
num[v]=num[u];
w[v]=w[u]+weight[v];
}
else if(d[u]+G[u][v]==d[v]){
num[v]+=num[u];
if(w[v]<w[u]+weight[v])
w[v]=w[u]+weight[v];
}
}
}
}
}
int main(){
fill(G[0],G[0]+MAXN*MAXN,INF);
fill(d,d+MAXN,INF);
cin>>n>>e>>st>>ed;
for(int i=0;i<n;i++)
cin>>weight[i];
int u,v;
for(int i=0;i<e;i++){
cin>>u>>v;
cin>>G[u][v];
G[v][u]=G[u][v];
}
dijkstra(st);
cout<<num[ed]<<" "<<w[ed];
return 0;
}
这个为什么错了
#include<bits/stdc++.h>
using namespace std;
const int INF=10000000;
int d[510],w[510],value[510]={0};
int dis[510][510];
int n,m,st,ed;
int path[510]={0};
bool isvis[510]={false};
void dijkstra(int now){
d[now]=0;
value[now]=w[now];
path[now]=1;
for(int i=0;i<n;i++){
int u=-1,min1=INF;
for(int j=0;j<n;j++){
if(isvis[j]==false&&d[j]<min1){
u=j;
min1=d[j];
}
}
if(u==-1) return;
isvis[u]=true;
for(int v=0;v<n;v++){
if(isvis[v]==false&&dis[u][v]!=INF){
if(d[u]+dis[u][v]<d[v]){
d[v]=dis[u][v]+d[u];
value[v]=value[u]+w[v];
path[v]=path[u];
}
else if(d[u]+dis[u][v]==d[v]){
if(value[u]+w[v]>value[u]){
value[v]=value[u]+w[v];
path[v]+=path[u];
}
else if(value[u]+w[v]==value[u])
path[v]+=path[u];
}
}
}
}
}
int main(){
cin>>n>>m>>st>>ed;
fill(d,d+510,INF);
fill(dis[0],dis[0]+510*510,INF);
for(int i=0;i<n;i++)
cin>>w[i];
for(int i=0;i<m;i++){
int a,b;
cin>>a>>b>>dis[a][b];
dis[b][a]=dis[a][b];
}
dijkstra(st);
cout<<path[ed]<<" "<<value[ed]<<endl;
}