0pts:
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=1e3+5;
int n,u,v,w,mp[N][N],vis[N],dis[N],cnt[N];
void addedge(int u,int v,int w){mp[u][v]=w;}
void dijkstra(){
for(int i=0;i<n;i++){
int k=n;
for(int j=0;j<n;j++){
if(!vis[j]&&dis[k]>dis[j]) k=j;
}
vis[k]=1;
for(int j=0;j<n;j++){
if(vis[j]&&mp[k][j]){
if(dis[j]+dis[k]==dis[mp[k][j]]) cnt[mp[k][j]]+=cnt[j]*cnt[k];
if(dis[mp[k][j]]>dis[j]+dis[k]){
dis[mp[k][j]]=dis[j]+dis[k];
cnt[mp[k][j]]=cnt[j]*cnt[k];
}
}
}
}
}
signed main(){
cin>>n;
dis[n]=1e9;
for(int i=0;i<n;i++) cin>>dis[i],cnt[i]=1;
while(cin>>u>>v>>w){
addedge(u,v,w);
addedge(v,u,w);
}
dijkstra();
cout<<dis[0]<<' '<<cnt[0]<<endl;
return 0;
}
100pts code:
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=1e3+5;
int n,u,v,w,mp[N][N],vis[N],dis[N],cnt[N];
void addedge(int u,int v,int w){mp[u][v]=w;}
void dijkstra(){
for(int i=1;i<=n;i++){
int k=0;
for(int j=1;j<=n;j++){
if(!vis[j]&&dis[k]>dis[j]) k=j;
}
vis[k]=1;
for(int j=1;j<=n;j++){
if(vis[j]&&mp[k][j]){
if(dis[j]+dis[k]==dis[mp[k][j]]) cnt[mp[k][j]]+=cnt[j]*cnt[k];
if(dis[mp[k][j]]>dis[j]+dis[k]){
dis[mp[k][j]]=dis[j]+dis[k];
cnt[mp[k][j]]=cnt[j]*cnt[k];
}
}
}
}
}
signed main(){
cin>>n;
dis[0]=1e9;
for(int i=1;i<=n;i++) cin>>dis[i],cnt[i]=1;
while(cin>>u>>v>>w){
addedge(u+1,v+1,w+1);
addedge(v+1,u+1,w+1);
}
dijkstra();
cout<<dis[1]<<' '<<cnt[1]<<endl;
return 0;
}
为什么偏要从 1 开始存?