最短路 spfa 算法 && 链式前向星存图

推荐博客  https://i.cnblogs.com/EditPosts.aspx?opt=1

     http://blog.csdn.net/mcdonnell_douglas/article/details/54379641

spfa  自行百度 说的很详细

spfa 有很多实现的方法  dfs  队列  栈  都可以 时间复杂度也不稳定 不过一般情况下要比bellman快得多

#include <stdio.h>
#include <math.h>
#include <string.h>
#include <stdlib.h>
#include <iostream>
#include <sstream>
#include <algorithm>
#include <string>
#include <queue>
#include <ctime>
#include <vector>
using namespace std;
const int maxn= 1e3+5;
const int maxm= 1e3+5;
const int inf = 0x3f3f3f3f;
typedef long long ll;
int n,m,s;   //n m s 分别表示 点数-标号从1开始 边数-标号从0开始 起点
struct edge
{
    int to,w;
};
int d[maxn];   //d[i]表示 i 点到源点 s 的最短距离
int p[maxn];    //p[i]记录最短路到达 i 之前的节点
int visit[maxn]; // 标记是否已进队
int cnt[maxn];
vector<edge> v[maxn];
int spfa(int x)
{
    queue<int> q;
    memset(visit,0,sizeof(visit));
    memset(cnt,0,sizeof(cnt));
    for(int i=1;i<=n;i++)
        d[i]=inf;
    d[x]=0;
    visit[x]=1;
    q.push(x);
    while(!q.empty())
    {
        int u=q.front();q.pop();
        visit[u]=0;
        for(int i=0;i<v[u].size();i++)
        {
            edge &e=v[u][i];
            if(d[u]<inf&&d[u]+e.w<d[e.to])
            {
                d[e.to]=d[u]+e.w;
                p[e.to]=u;
                if(!visit[e.to])
                {
                    q.push(e.to);
                    visit[e.to]=1;
                    if(++cnt[e.to]>n)
                        return 0;
                }
            }
        }
    }
    return 1;
}
void Print_Path(int x)
{
    while(x!=p[x])          //逆序输出 正序的话用栈处理一下就好了
    {
        printf("%d ",x);
        x=p[x];
    }
    printf("%d\n",x);
}
int main()
{
    while(scanf("%d %d %d",&n,&m,&s)!=EOF)
    {
        int x,y,z;
        for(int i=0;i<m;i++)
        {
            scanf("%d %d %d",&x,&y,&z);
            edge e;
            e.to=y;
            e.w=z;
            v[x].push_back(e);
//            e.to=x;           //无向图 反向建边
//            v[y].push_back(e);
        }
        p[s]=s;
        if(spfa(s)==1)
            for(int i=1;i<=n;i++)
            {
                printf("%d %d\n",i,d[i]);
                Print_Path(i);
            }
        else
            printf("sorry\n");
        return 0;
    }
}

链式前向星存图

 1 #include <stdio.h>
 2 #include <math.h>
 3 #include <string.h>
 4 #include <stdlib.h>
 5 #include <iostream>
 6 #include <sstream>
 7 #include <algorithm>
 8 #include <string>
 9 #include <queue>
10 #include <ctime>
11 #include <vector>
12 using namespace std;
13 const int maxn= 1e3+5;
14 const int maxm= 1e3+5;
15 const int inf = 0x3f3f3f3f;
16 typedef long long ll;
17 int n,m;
18 int first[maxn];
19 struct edge
20 {
21     int to,next,w;
22 }e[maxn];
23 void add(int i,int u,int v,int w)
24 {
25     e[i].to=v;
26     e[i].w=w;
27     e[i].next=first[u];
28     first[u]=i;
29 }
30 int main()
31 {
32     scanf("%d %d",&n,&m);
33     {
34         int u,v,w;
35         memset(first,-1,sizeof(first));
36         for(int i=0;i<m;i++)
37         {
38             scanf("%d %d %d",&u,&v,&w);
39             add(i,u,v,w);
40         }
41         for(int i=1;i<=n;i++)
42         {
43              cout<<"from"<<i<<endl;
44              for(int j=first[i];j!=-1;j=e[j].next)  //遍历以j为起点的每条边
45                 cout<<"to"<<e[j].to<<" length="<<e[j].w<<endl;
46         }
47
48     }
49 }
50 //输入
51 //6 9
52 //1 2 2
53 //1 4 -1
54 //1 3 1
55 //3 4 2
56 //4 2 1
57 //3 6 3
58 //4 6 3
59 //6 5 1
60 //2 5 -1
61 //输出
62 //from1
63 //to3 length=1
64 //to4 length=-1
65 //to2 length=2
66 //from2
67 //to5 length=-1
68 //from3
69 //to6 length=3
70 //to4 length=2
71 //from4
72 //to6 length=3
73 //to2 length=1
74 //from5
75 //from6
76 //to5 length=1
时间: 2024-10-07 08:58:01

最短路 spfa 算法 && 链式前向星存图的相关文章

链式前向星存图

#include <iostream> #include <cstdio> #include <algorithm> #include <cstring> #define INF 0x3f3f3f3f using namespace std; typedef long long ll; const int maxn = 1000000 + 5; int n,m,be,en; int to[maxn]; int cost[maxn]; int head[max

UESTC30-最短路-Floyd最短路、spfa+链式前向星建图

最短路 Time Limit: 3000/1000MS (Java/Others) Memory Limit: 65535/65535KB (Java/Others) 在每年的校赛里,所有进入决赛的同学都会获得一件很漂亮的T-shirt.但是每当我们的工作人员把上百件的衣服从商店运回到赛场的时候,却是非常累的!所以现在他们想要寻找最短的从商店到赛场的路线,你可以帮助他们吗? Input 输入包括多组数据. 每组数据第一行是两个整数NN ,MM (N≤100N≤100 ,M≤10000M≤1000

【最短路】Dijkstra+ 链式前向星+ 堆优化(优先队列)

Dijkstra+ 链式前向星+ 优先队列   Dijkstra算法 Dijkstra最短路算法,个人理解其本质就是一种广度优先搜索.先将所有点的最短距离Dis[ ]都刷新成∞(涂成黑色),然后从起点x (Dis[x]= 0, Dis[]值最小 )开始查询:先将x 加入(涂成灰色),对x 的所有边进行遍历,对所有搜索到的点x+ 1 进行松弛(刷新),若经过x 点的松弛,得到的距离小于原来的值:Dis[x]+ dis(x, x+ 1) < Dis[x+ 1], 则用新值刷新,把x+ 1加入(涂成灰

NYOJ 20 吝啬的国度 【BFS+链式前向星建图,Vector建图】

吝啬的国度 时间限制:1000 ms  |  内存限制:65535 KB 难度:3 描述 在一个吝啬的国度里有N个城市,这N个城市间只有N-1条路把这个N个城市连接起来.现在,Tom在第S号城市,他有张该国地图,他想知道如果自己要去参观第T号城市,必须经过的前一个城市是几号城市(假设你不走重复的路). 输入 第一行输入一个整数M表示测试数据共有M(1<=M<=5)组 每组测试数据的第一行输入一个正整数N(1<=N<=100000)和一个正整数S(1<=S<=100000

链式前向星建图

1 /* 2 //链式前向星维护的是一个边集数组 3 const int N = 1e6+5;//边的数目 4 int head[N];//某个点相邻的第一条边的编号 5 int cnt;//边的数目 6 struct Edge{ 7 int to;//这条边到达的终点 8 int dis;//这条边的权值 9 int next;//这条边指向的下一条边的编号(可以自己想想,并不是上一条,采用的是类似于前插法) 10 }edge[N]; 11 void addEdge(int u,int v,i

链式前向星DFS

采用链式前向星存图的DFS: #include <iostream> #include <cmath> #include <cstdio> #include <cstring> #include <cstdlib> #include <algorithm> #include <queue> using namespace std; typedef long long LL; const int maxN = 100 + 3

关于MOD&amp;链式前向星-2015年9月25日

好久没写了,其实一直也在做,但是没心情写总结文章,所以还是以后做一点就写一点吧. 最近状态很差很差,打水题都过不了,我也是醉了. 重做了去年的两道noip题,D1T2和D2T3,里面包括了MOD运算. MOD运算基本满足四则运算,所以很多表达式在模p意义下都是等价的,但除法除外. 但是还要注意,需要在非负情况下进行计算,当出现减法时,一定要加到正值再做. 另外注意溢出的问题,及时取模也是很重要的. noip2014D1T2可以用链式前向星存图. 大概就是这样: struct Edge{ int

HDU3342 Legal or Not【拓扑排序】【链式前向星】

Legal or Not Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 4633    Accepted Submission(s): 2115 Problem Description ACM-DIY is a large QQ group where many excellent acmers get together. It is

hdu2647 逆拓扑,链式前向星。

原文地址 题目分析 题意 老板发工资,但是要保证发的工资数满足每个人的期望,比如A期望工资大于B,只需比B多1元钱即可.老板发的最低工资为888元.输出老板最少发的工资总数,若是无法满足大家的期望,则输出-1. 分析 很明显这是一个拓扑问题,若存在环则无法满足大家的期望.若按常理,A>B,则可能会建立A指向B的有向边.此题不然,因为我们只知道最少的钱数是888,所以从小到大进行拓扑排序更为恰当.所以是建立B指向A的有向边.此之为逆拓扑排序.因为这样处理后排序的结果与原先拓扑排序的顺序相反. 以图