题目
答案
#include<iostream>
#include<cstring>
using namespace std;
#define inf 0x3f3f3f3f
int map[501][501],vis[501],init_num[501],max_num[501],dis[501],root[501],cnt[501];
int n,m,start,last;
void init()
{
memset(root,-1,sizeof root);
memset(map,inf,sizeof map);
memset(vis,0,sizeof vis);
cin>>n>>m>>start>>last;
for(int i=0;i<n;i++)
{
cnt[i]=1;
map[i][i]=0;
}
for(int i=0;i<n;i++)
{
cin>>init_num[i];
max_num[i]=init_num[i];
}
while(m--)
{
int x,y,z;
cin>>x>>y>>z;
map[x][y]=map[y][x]=z;
}
for(int i=0;i<n;i++)
dis[i]=map[start][i];
vis[start]=1;
}
void dijkstra()
{
int t=n;
int min,pos;
while(t--)
{
min=inf,pos=-1;
for(int i=0;i<n;i++)
{
if(!vis[i]&&dis[i]<min)
{
min=dis[i];
pos=i;
}
}
if(pos==-1) break;
vis[pos]=1;
for(int i=0;i<n;i++)
{
if(!vis[i]&&dis[pos]+map[pos][i]<dis[i])
{
dis[i]=dis[pos]+map[pos][i];
cnt[i]=cnt[pos];
max_num[i]=max_num[pos]+init_num[i];
root[i]=pos;
}
else if(!vis[i]&&dis[pos]+map[pos][i]==dis[i])
{
cnt[i]+=cnt[pos];
if(max_num[i]<max_num[pos]+init_num[i])
{
max_num[i]=max_num[pos]+init_num[i];
root[i]=pos;
}
}
}
}
}
void print(int last)
{
if(root[last]!=-1)
{
print(root[last]);
cout<<root[last]<<" ";
}
}
int main()
{
init();
dijkstra();
cout<<cnt[last]<<" "<<init_num[start]+max_num[last]<<endl;
cout<<start<<" ";
print(last);
cout<<last;
}
注意
对于数组的初始化赋值要在n的赋值之后,否则会出错(我自己血的教训!)