zoukankan      html  css  js  c++  java
  • 最短路

    Floyed

    http://codevs.cn/problem/1077/

    #include<cstdio>
    const int N=105;
    typedef long long ll; 
    ll dis[N][N];
    int main(){
        int n,q;
        scanf("%d",&n);
        for(int i=1;i<=n;++i)
            for(int j=1;j<=n;++j) scanf("%lld",&dis[i][j]);
        for(int k=1;k<=n;++k)
            for(int i=1;i<=n;++i)
                for(int j=1;j<=n;++j)
                    if(dis[i][k]+dis[k][j]<dis[i][j]) dis[i][j]=dis[i][k]+dis[k][j];
        scanf("%d",&q);
        for(int i=1;i<=q;++i){
            int u,v;
            scanf("%d%d",&u,&v);
            printf("%lld
    ",dis[u][v]);
        }
        return 0;
    }

     利用floyed求最小环

    http://acm.hdu.edu.cn/showproblem.php?pid=1599

    无向图

    #include<cstdio>
    #include<cstring>
    #include<algorithm>
    using namespace std;
    const int N=105,inf=1061109567;
    int dis[N][N],lb[N][N];
    int main(){
        int n,m,u,v,w;
        while(scanf("%d%d",&n,&m)!=EOF){
            int ans=inf;
            memset(dis,0x3f,sizeof(dis));
            memset(lb,0x3f,sizeof(lb));
            while(m--){
                scanf("%d%d%d",&u,&v,&w);
                lb[u][v]=lb[v][u]=dis[u][v]=dis[v][u]=min(lb[u][v],w);
            }
            for(int k=1;k<=n;++k){
                for(int i=1;i<k;++i)
                    if(lb[i][k]<inf)
                        for(int j=i+1;j<k;++j)
                            if(lb[j][k]<inf) ans=min(ans,lb[i][k]+lb[k][j]+dis[i][j]);
                for(int i=1;i<=n;++i)
                    for(int j=1;j<=n;++j)
                        if(lb[i][k]>0) dis[i][j]=min(dis[i][j],dis[i][k]+dis[k][j]);     
            }
            if(ans==inf) printf("It's impossible.
    ");
            else printf("%d
    ",ans);
        }
        return 0;
    }

    lg4779

     https://www.luogu.org/problemnew/show/P4779

    dijkstra

    #include<cstdio>
    #include<queue>
    #include<cstring> 
    using namespace std;
    const int N=1e5+5;
    struct E{
        int v,n,q;
    }e[N*5];
    int fir[N],s,dis[N],ss;
    bool vis[N];
    struct F{
        int v,q;
        bool operator<(const F &a)const{
            return q>a.q;
        } 
    }st;
    priority_queue<F>dl;
    void add(int u,int v,int q){
        e[++s].v=v;
        e[s].q=q;
        e[s].n=fir[u];
        fir[u]=s;
    }
    int main(){
        int n,m,u,v,q;
        scanf("%d%d%d",&n,&m,&st.v);
        while(m--){
            scanf("%d%d%d",&u,&v,&q);
            add(u,v,q);
        }
        dl.push(st);
        for(int i=1;i<=n;++i) dis[i]=2147483647;
        dis[st.v]=0;
        while(!dl.empty()){
            F t=dl.top();dl.pop();
            if(vis[t.v]) continue;
            vis[t.v]=1;++ss;
            for(int i=fir[t.v];i;i=e[i].n)
                if(t.q+e[i].q<dis[e[i].v]){
                    dis[e[i].v]=e[i].q+t.q;
                    if(!vis[e[i].v]) dl.push((F){e[i].v,dis[e[i].v]});
                }
        }
        for(int i=1;i<=n;++i)
            printf("%d ",dis[i]);
        return 0;
    } 

     lg3371

    https://www.luogu.org/problemnew/show/P3371

    spfa

    #include<cstdio>
    #include<queue>
    using namespace std;
    const int N=1e4+5,M=5e5+5;
    struct E{
        int v,q,n;
    }e[M];
    int fir[N],s,dis[N];
    queue<int>dl;
    bool vis[N];
    void add(int u,int v,int q){
        e[++s].v=v;
        e[s].q=q;
        e[s].n=fir[u];
        fir[u]=s;
    }
    int main(){
        int n,m,st,u,v,q;
        scanf("%d%d%d",&n,&m,&st);
        while(m--){
            scanf("%d%d%d",&u,&v,&q);
            add(u,v,q);
        }
        dl.push(st);
        vis[st]=1;
        for(int i=1;i<=n;++i) dis[i]=2147483647;
        dis[st]=0;
        while(!dl.empty()){
            u=dl.front();dl.pop();
            for(int i=fir[u];i;i=e[i].n)
                if(dis[u]+e[i].q<dis[e[i].v]){
                    dis[e[i].v]=dis[u]+e[i].q;
                    if(!vis[e[i].v]){
                        vis[e[i].v]=1;
                        dl.push(e[i].v);
                    }
                }
            vis[u]=0;
        }
        for(int i=1;i<=n;++i) printf("%d ",dis[i]);
        return 0;
    }
  • 相关阅读:
    我爱java系列之---【微服务间的认证—Feign拦截器】
    我爱java系列之---【设置权限的三种解决方案】
    581. Shortest Unsorted Continuous Subarray
    129. Sum Root to Leaf Numbers
    513. Find Bottom Left Tree Value
    515. Find Largest Value in Each Tree Row
    155. Min Stack max stack Maxpop O(1) 操作
    painting house
    Minimum Adjustment Cost
    k Sum
  • 原文地址:https://www.cnblogs.com/bzmd/p/11119054.html
Copyright © 2011-2022 走看看