zoukankan      html  css  js  c++  java
  • Spfa(最短路求解)

    spfa(最短路求解)

    模板:

    
    #include<iostream>  
    #include<cstdio>  
    #include<queue>  
    #include<cstring>  
    using namespace std;  
    const int maxn = 105;  
    const int maxm = 100005;  
    struct Edge{  
        int to,w,next;  
    }edge[maxm<<1];  
    int tot = 0,dis[maxn],cnt[maxn],head[maxn];  
      
    void addedge(int u,int v,int w)  
    {  
        edge[tot].to = v;edge[tot].w = w;edge[tot].next = head[u];  
        head[u] = tot++;  
    }  
      
    void spfa(int st,int ed)  
    {  
        int i;  
        queue<int>que;  
        while (!que.empty())    que.pop();  
        memset(dis,0x3f3f3f3f,sizeof(dis));  
        memset(cnt,0,sizeof(cnt));  
        que.push(st);  
        dis[st] = 0;  
        cnt[st] = 1;  
        while (!que.empty())  
        {  
            int u = que.front();  
            que.pop();  
            if (u == ed)    continue;  
            for (i = head[u];i != -1;i = edge[i].next)  
            {  
                int v = edge[i].to;  
                if (dis[u] + edge[i].w < dis[v])  
                {  
                    dis[v] = dis[u] + edge[i].w;  
                    if (!cnt[v])    que.push(v);  
                    cnt[v] = cnt[u];  
                }  
                else if (dis[u] + edge[i].w == dis[v])  
                {  
                    if (!cnt[v])    que.push(v);  
                    cnt[v] += cnt[u];  
                }  
            }  
        }  
    }  
      
    int main()  
    {  
        int N,M,S,E,u,v,w,i;  
        memset(head,-1,sizeof(head));  
        scanf("%d%d%d%d",&N,&M,&S,&E);  
        while (M--)  
        {  
            scanf("%d%d%d",&u,&v,&w);  
            addedge(u,v,w);  
            addedge(v,u,w);  
        }  
        spfa(S,E);  
        printf("%d %d
    ",dis[E],cnt[E]);  
        return 0;  
    }  
    
    

    也可以计算有多少个最小生成树

  • 相关阅读:
    C#:BackgroundWorker的简单使用
    C#:DataTable 操作
    树和二叉树
    Git下的标签
    python的高级应用
    字符串匹配的BF算法和KMP算法学习
    GitHub:多人协作下的分支处理
    Git:分支的创建、合并、管理和删除
    GitHub:创建和修改远程仓库
    Git:文件操作和历史回退
  • 原文地址:https://www.cnblogs.com/fzuljz/p/6115512.html
Copyright © 2011-2022 走看看