不保证正确,只作为备份,代码参考于网络(忘了哪来的了)。
SPFA 未优化
#include<stdio.h>
#include<stdlib.h>
#define MAXN 20003
#define MAXM 200003
#define oo 1000000000
struct edge
{
int node,len,next;
} e[MAXM]= {0};
int dist[MAXN]= {0},n,m,head[MAXN]= {0},q[MAXM],tot=0,f[MAXN]= {0};
void add(int x,int y,int z)
{
e[++tot].node=y;
e[tot].len=z;
e[tot].next=head[x];
head[x]=tot;
}
void init()
{
int i,x,y,z;
scanf("%d%d",&n,&m);
for(i=2; i<=n; i++)
dist[i]=oo;
for(i=1; i<=m; i++)
{
scanf("%d%d%d",&x,&y,&z);
add(x,y,z);
}
}
void spfa()
{
int op=1,cl=1,i,j,k;
q[1]=1;
f[1]=1;
while(op>=cl)
{
j=head[q[cl]];
while(j)
{
k=e[j].node;
if(dist[k]>dist[q[cl]]+e[j].len)
{
dist[k]=dist[q[cl]]+e[j].len;
if(!f[k]) f[q[++op]=k]=1;
}
j=e[j].next;
}
f[q[cl++]]=0;
}
for(i=2; i<=n; i++)
printf("%d ",dist[i]);
printf("\n");
}
int main()
{
init();
spfa();
return 0;
}
BF算法 队列优化
#include <stdio.h>
#include <stdlib.h>
int main()
{
int n,m,i,k;
int u[20001], v[20001], w[20001];
int first[20002], next[20002];
int dis[20001]={0}, book[20001]={0};
int que[20001]={0}, head=1, tail=1;
int inf = 99999999;
scanf("%d%d",&n,&m);
for(i=1; i<=n; i++)
dis[i] = inf;
dis[1] = 0;
for(i=1;i<=n;i++)
book[i]=0;
for(i=1; i<=n; i++)
first[i]=-1;
for(i=1; i<=m; i++)
{
scanf("%d%d%d",&u[i],&v[i],&w[i]);
next[i] = first[u[i]];
first[u[i]]=i;
}
que[tail]=1;
tail++;
book[1]=1;
while(head<tail)
{
k = first[que[head]];
while(k!=-1)
{
if(dis[v[k]]>dis[u[k]]+w[k]) //判断是否松弛成功
{
dis[v[k]] = dis[u[k]]+w[k];
if(book[v[k]]==0)
{
que[tail]=v[k];
tail++;
book[v[k]]=1;
}
}
k = next[k];
} //出队
book[que[head]]=0;
head++;
}
for(i=2; i<=n; i++)
printf("%d ",dis[i]);
return 0;
}
这个我还没看懂,哪位大神帮忙看一下
#include <stdio.h>
#include <string.h>
#define MAXN 0x7fffffff
int main ()
{
int n, m, u, v, l,i,j;
scanf ("%d%d", &n, &m);
short int s[n+1][n+1];
short int flag[n+1];
memset (s, 0x7f, sizeof (s));
memset (flag, 0, sizeof (flag));
for (i = 0; i < m; i++)
{
scanf ("%d%d%d", &u, &v, &l);
s[u][v] = l;
}
for (i = 1; i < n; i++)
{
int minLen = MAXN;
int minJ = 0;
for (j = 2; j <= n; j++)
{
if (s[1][j] < minLen && flag[j] == 0)
{
minLen = s[1][j];
minJ = j;
}
}
flag[minJ] = 1;
for (j = 2; j <= n; j++)
{
if (s[minJ][j] < MAXN && s[minJ][j] + minLen < s[1][j])
s[1][j] = s[minJ][j] + minLen;
}
}
for (i = 2; i <= n; i++)
printf ("%d\n", s[1][i]);
return 0;
}