最开始这题没有写对,找了半天错误,以为Dijkstra函数写错了,最后发现没有将矩阵初始化为INF。。。真令人头大。
#include <bits/stdc++.h>
#define INF 0x3f3f3f3f
using namespace std;
int N,M,S,D;
int mapp[510][510]; //邻接矩阵
int nums[510]; //节点消防员数目
int Dis[510]; //最短距离数组
bool used[510]={0}; //标志
int pre[510]; //前驱节点
int sum[510]; //走到节点i召集的消防员最大总数
int cnt[510]; //节点i同长路径数目
vector<int> path;
void dijkstra(int s)
{
fill(Dis,Dis+N,INF);
fill(used,used+N,false);
fill(pre,pre+N,-1);
Dis[s]=0;
sum[s]=nums[s];
cnt[s]=1;
while(1)
{
int v=-1;
//cout<<v<<endl;
for(int u=0;u<N;u++)
{
if(!used[u]&&(v==-1||Dis[u]<Dis[v]))
v=u;
}
if(v==-1)
break;
used[v]=true;
for(int u=0;u<N;u++)
{
if(mapp[v][u]==INF)
continue;
if(Dis[u]>Dis[v]+mapp[v][u])
{
Dis[u]=Dis[v]+mapp[v][u];
pre[u]=v;
cnt[u]=cnt[v];
sum[u]=sum[v]+nums[u];
}
else
{
if(Dis[u]==Dis[v]+mapp[v][u])
{
cnt[u]+=cnt[v];
if(nums[u]+sum[v]>sum[u])
{
sum[u]=sum[v]+nums[u];
pre[u]=v;
}
}
}
}
}
cout<<cnt[D]<<" "<<sum[D]<<endl;
int k=D;
while(k!=S)
{
path.push_back(k);
k=pre[k];
}
path.push_back(k);
reverse(path.begin(),path.end());
for(int i=0;i<path.size();i++)
{
if(i!=0)
printf(" ");
printf("%d",path[i]);
}
cout<<endl;
}
int main()
{
scanf("%d%d%d%d",&N,&M,&S,&D);
for(int i=0;i<N;i++)
for(int j=0;j<N;j++)
mapp[i][j]=INF;
for(int i=0;i<N;i++)
scanf("%d",&nums[i]);
for(int i=0;i<M;i++)
{
int x,y;
scanf("%d%d",&x,&y);
scanf("%d",&mapp[x][y]);
mapp[y][x]=mapp[x][y];
}
dijkstra(S);
return 0;
}