spfa只是加上求权值的部分
我有傻傻的开小了边数的数组——N^2
学会了用queue
#include <iostream>
#include <cstdio>
#include <cstring>
#include <queue>
using namespace std;
#define INF 0x7fffffff
int tmp;
struct point{
int y,z,next;
}edge[250010];
int l,n,m,st,ed;
int a[500],head[500],dis[500],value[500];
bool inq[500];
int x,y,z,top,tail,p;
queue <int>q;
void add(int x,int y,int z)
{
l++;
edge[l].y=y;
edge[l].z=z;
edge[l].next=head[x];
head[x]=l;
}
int main()
{
cin>>n>>m>>st>>ed;
memset(head,-1,sizeof(head));
for (int i=0;i<n;i++) cin>>a[i];
for (int i=1;i<=m;i++)
{
cin>>x>>y>>z;
add(x,y,z);
add(y,x,z);
}
for (int i=0;i<n;i++)
dis[i]=INF;
dis[st]=0;
memset(inq,0,sizeof(inq));
inq[st]=1;
memset(value,0,sizeof(value));
value[st]=a[st];
q.push(st);
while (!q.empty())
{
tmp=q.front();
inq[tmp]=0;
q.pop();
p=head[tmp];
while(~p)
{
if (dis[tmp]+edge[p].z<dis[edge[p].y])
{
dis[edge[p].y]=dis[tmp]+edge[p].z;
value[edge[p].y]=value[tmp]+a[edge[p].y];
if (inq[edge[p].y]==0)
{
q.push(edge[p].y);
inq[edge[p].y]=1;
}
}
else if (dis[tmp]+edge[p].z==dis[edge[p].y] && value[tmp]+a[edge[p].y]>value[edge[p].y])
{
value[edge[p].y]=value[tmp]+a[edge[p].y];
if (inq[edge[p].y]==0)
{
q.push(edge[p].y);
inq[edge[p].y]=1;
}
}
p=edge[p].next;
}
}
cout<<dis[ed]<<' '<<value[ed]<<endl;
return 0;
}