spfa模板

 1 int SPFA(Graph &g, int s, int dist[])
 2 {
 3     int inQueue[MAX]={0};
 4     int num[MAX]={0}; //记录入队次数
 5     int i, j;
 6     for (i = 0; i < g.n; i++)//初始化最大值
 7     dist[i] = MAXINT;
 8     int q[MAX*MAX], front=0, back=0;
 9     q[back++] = s;//源点入队
10     dist[s] = 0;//到自身距离为 0
11     inQueue[s] = 1;//检查是否入队
12     num[s]++;//入队次数加 1
13     while (front!=back)
14     {
15         int u = q[front++], v;//u 出队
16         inQueue[u] = 0;//标记不在队列中
17         for (v=0; v<g.n; v++)
18         {
19             if (g.data[u][v]!=MAXINT) //u 与 v 直接邻接
20             {
21                 if (dist[u] + g.data[u][v] < dist[v])
22                 {
23                     dist[v] = dist[u] + g.data[u][v];
24                     if (!inQueue[v])//不再队列中
25                     {
26                         q[back++] = v;//v 入队
27                         num[v]++;//v 次数加 1
28                         if (num[v]>=g.n)//负权回路
29                         return 0;
30                         inQueue[v] = 1;//标记 v 入队
31                     } 
32                 } 
33             } 
34         } 
35     }
36     return 1;
37 }
View Code

模板题:https://www.acwing.com/problem/content/854/

posted @ 2019-10-11 22:05  麦客_zeng  阅读(87)  评论(0)    收藏  举报