#include<bits/stdc++.h>
using namespace std;
const int N = 10000 + 10;
struct xx
{
int v;
int c;
} f[N];
int head[N];
int nex[N];
int dis[N];
int vis[N];
int cnt[N];
int e, n, m;
void Clear()
{
memset(head, -1, sizeof(head));
memset(nex, -1, sizeof(nex));
e = 0;
}
void add(int u, int v, int c)
{
f[e].v = v, f[e].c = c;
nex[e] = head[u], head[u] = e++;
}
int relax(int u, int v, int c)
{
if(dis[v] > dis[u] + c)
{
dis[v] = dis[u] + c;
return 1;
}
return 0;
}
void spfa(int x)
{
memset(vis, 0, sizeof(vis));
memset(cnt, 0, sizeof(cnt));
for(int i = 1; i <= n; i++)
dis[i] = 0x3f3f3f3f;
dis[x] = 0, vis[x] = 1;
queue<int> k;
k.push(x);
while(!k.empty())
{
int pre = k.front();
k.pop();
vis[pre] = 0;
for(int i = head[pre]; i+1; i = nex[i])
{
if(relax(pre, f[i].v, f[i].c) && !vis[f[i].v])
{
if((++cnt[f[i].v]) > n) return ;
k.push(f[i].v);
vis[f[i].v] = 1;
}
}
}
return ;
}
int main()
{
while(scanf("%d%d", &n, &m) == 2, n)
{
Clear();
for(int i = 0; i < m; i++)
{
int u, v, c;
scanf("%d%d%d", &u, &v, &c);
add(u, v, c);
add(v, u, c);
}
spfa(1);
printf("%d\n", dis[n]);
}
}
个人模板 最短路SPFA
最新推荐文章于 2024-08-02 12:01:18 发布