题意:给一个无向图,图上的每个点有权重,然后写出从起始点到终点的最短路的个数和最大权重和
思路:dis
注意点:…求最短路的个数的时候,如果当前的点到起点长度等于当前点到前一个点再到终点的路程的时候,个数应该是当前点+=前一个点(= =每次都会犯这个错,啊,对自己真是无语了)
#include<bits/stdc++.h>
using namespace std;
#define INF 0x3f3f3f3f
int n,m;
int s,e;
int weight[505];
int mate[505][505];
int dis[505];
int vis[505];
int reache[505];
int ans[505];
int main(){
memset(dis,INF,sizeof(dis));
memset(mate,INF,sizeof(mate));
cin>>n>>m;
cin>>s>>e;
for(int i=0;i<n;i++){
cin>>weight[i];
}
for(int i=0;i<m;i++){
int a,b,c;
cin>>a>>b>>c;
mate[a][b]=mate[b][a]=c;
}
dis[s]=0;
ans[s]=weight[s];
reache[s]=1;
while(1){
int minn=INF;
int index=-1;
for(int i=0;i<n;i++){
if((dis[i]<minn)&&(vis[i]==0)){
index=i;
minn=dis[i];
}
}
if(index==-1)
break;
//cout<<index<<endl;
vis[index]=1;
for(int i=0;i<n;i++){
if(vis[i]==0&&mate[index][i]!=INF){
if(dis[i]>(mate[index][i]+dis[index])){
dis[i]=mate[index][i]+dis[index];
ans[i]=ans[index]+weight[i];
reache[i]=reache[index];
}
else if(dis[i]==(mate[index][i]+dis[index])){
ans[i]=max(ans[i],ans[index]+weight[i]);
reache[i]+=reache[index];
}
}
}
}
cout<<reache[e]<<" "<<ans[e]<<endl;
return 0;
}