zoukankan      html  css  js  c++  java
  • P1144 最短路计数 (bfs/SPFA)

    题目链接

     方法1:

      bfs

    Code:

    #include <bits/stdc++.h>
    # define LL long long
    using namespace std;
    
    const int maxn=1000000+10;
    int N,M;
    vector<int> adj[maxn];
    int res[maxn];
    int dis[maxn];
    const int mod=100003;
    
    void bfs(){
        memset(dis,-1,sizeof(dis));
        queue<int> q;
        q.push(1);
        res[1]=1;
        dis[1]=0;
        while(!q.empty()){
            int cur=q.front();
            q.pop();
            for(int i=0;i<adj[cur].size();++i){
                int v=adj[cur][i];
                if(dis[v]==-1){
                    dis[v]=1+dis[cur];
                    q.push(v);
                }
                if(dis[v]==1+dis[cur]){
                    res[v]=(res[v]+res[cur])%mod;
                }
            }
        }
    }
    
    int main(){
        scanf("%d %d", &N, &M);
        for(int i=1;i<=M;++i){
            int a,b;
            scanf("%d %d", &a, &b);
            adj[a].push_back(b);
            adj[b].push_back(a);
        }
    
        bfs();
        for(int i=1;i<=N;++i){
            printf("%d
    ", res[i]);
        }
        return 0;
    }

    方法2:

      SPFA

    Code:

    #include <bits/stdc++.h>
    # define LL long long
    using namespace std;
    
    const int maxn=1000000+10;
    int N,M;
    vector<int> adj[maxn];
    int res[maxn];
    int dis[maxn];
    const int mod=100003;
    
    void spfa(){
        memset(dis,127,sizeof(dis));
        dis[1]=0;
        res[1]=1;
        queue<int> q;
        int inqueue[maxn];
        q.push(1);
        inqueue[1]=1;
        while(!q.empty()){
            int cur=q.front();
            q.pop();
            inqueue[cur]=0;
            for(int i=0;i<adj[cur].size();++i){
                int v=adj[cur][i];
                if(dis[cur]+1<dis[v]){
                    res[v]=res[cur];
                    dis[v]=1+dis[cur];
                    if(inqueue[v]==0){
                        inqueue[v]=1;
                        q.push(v);
                    }
                }else if(dis[cur]+1==dis[v]){
                    res[v]=(res[v]+res[cur])%mod;
                }
            }
        }
    }
    
    int main(){
        scanf("%d %d", &N, &M);
        for(int i=1;i<=M;++i){
            int a,b;
            scanf("%d %d", &a, &b);
            adj[a].push_back(b);
            adj[b].push_back(a);
        }
    
        spfa();
        for(int i=1;i<=N;++i){
            printf("%d
    ", res[i]);
        }
        return 0;
    }

    以上方法只能针对无权图(权值为1)的情况,如若权值不为1,则先用spfa找最短路径,再Memo求路径条数。

    Code:

    #include <bits/stdc++.h>
    # define LL long long
    using namespace std;
    
    const int maxn=1000000+10;
    int N,M;
    vector<int> adj[maxn];
    int res[maxn];
    int dis[maxn];
    const int mod=100003;
    
    void spfa(){
        memset(dis,127,sizeof(dis));
        dis[1]=0;
        queue<int> q;
        int inqueue[maxn];
        q.push(1);
        inqueue[1]=1;
        while(!q.empty()){
            int cur=q.front();
            q.pop();
            inqueue[cur]=0;
            for(int i=0;i<adj[cur].size();++i){
                int v=adj[cur][i];
                if(dis[cur]+1<dis[v]){
                    dis[v]=1+dis[cur];
                    if(inqueue[v]==0){
                        inqueue[v]=1;
                        q.push(v);
                    }
                }
            }
        }
    }
    
    int dfs(int u){
        if(u==1){
            return res[1]=1;
        }
        if(res[u]!=-1) return res[u];
        res[u]=0;
        for(int i=0;i<adj[u].size();++i){
            int v=adj[u][i];
            if(dis[v]+1==dis[u]){
                res[u]=(res[u]+dfs(v))%mod;
            }
        }
        return res[u];
    }
    
    int main(){
        scanf("%d %d", &N, &M);
        for(int i=1;i<=M;++i){
            int a,b;
            scanf("%d %d", &a, &b);
            adj[a].push_back(b);
            adj[b].push_back(a);
        }
    
        spfa();
        memset(res,-1,sizeof(res));
        for(int i=1;i<=N;++i){
            dfs(i);
        }
    
        for(int i=1;i<=N;++i){
            printf("%d
    ", res[i]);
        }
        return 0;
    }
  • 相关阅读:
    mysql迁移达梦数据库varchar长度问题
    处理器 i3 i5 i7 i9 区别,以及K F 区别
    mybatis配置文件,Mapper标签下以package包扫描形式时需要Mapper.xml文件名称和mapper接口名称一致
    add、commit、push、pull 、merge 的区别与作用
    testng 接口测试,读取Excel表格数据中json数据,做数据驱动
    windows 系统查看端口与进程,查看某个具体的端口所占用的进程号,杀掉进程
    码云gitee删除仓库
    java.sql.SQLNonTransientConnectionException: Public Key Retrieval is not allowed
    maven+mybatis+spring 项目整合log4j,实现控制台打印SQL语句
    将idea 中 代码提交至码云
  • 原文地址:https://www.cnblogs.com/FEIIEF/p/12245429.html
Copyright © 2011-2022 走看看