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;
    }
  • 相关阅读:
    初见QT---信号和槽(二)
    初见QT---信号和槽
    Python的那些事---数据分析(一)---NumPy基础
    初见QT---创建QPushButton按钮
    初见QT---QT creator常见快捷键使用
    PHP 反射 Reflection
    python 代码求阶乘
    Python中的计时器对象
    python websocket 再线聊天室的 Demo
    Tornado创建一个web服务
  • 原文地址:https://www.cnblogs.com/bzmd/p/11119054.html
Copyright © 2011-2022 走看看