SPFA记录档
经典边集数组+玄学优化
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
const int N = 110, M = 1010;
int n,m,tot,s,t;
bool vis[N];
int dist[N],las[N],data[N];
struct edge{
int x,y,c;
int next;
}e[M];
void AddEdge(int x,int y,int z)
{
e[++ tot].x = x;
e[tot].y = y;
e[tot].c = z;
e[tot].next = las[x];
las[x] = tot;
}
void Spfa(int s)
{
int head = 0, tail = 1;
memset(data,0,sizeof data);
memset(vis,0,sizeof vis);
memset(dist,127,sizeof dist);
dist[s] = 0;
data[1] = s;
vis[s] = true;
while (head ++ < tail)
{
int x = data[head];
for (int tmp = las[x];tmp > 0;tmp = e[tmp].next)
if (dist[x] < dist[e[tmp].y] - e[tmp].c)
{
dist[e[tmp].y] = dist[x] + e[tmp].c;
if(!vis[e[tmp].y])
{
data[++ tail] = e[tmp].y;
vis[e[tmp].y] = true;
}
}
vis[x] = false;
}
}
int main()
{
scanf("%d%d%d%d", &n, &m, &s, &t);
for (int i = 1;i <= m;i ++)
{
int x,y,c;
scanf("%d%d%d", &x, &y, &c);
AddEdge(x,y,c);
}
Spfa(s);
printf("%d", dist[t]);
}