• 最短路


    杭电oj ----2544

          深    搜

    Accepted 2544 327MS 1768K 635 B C++
    #include <cstdio>
    #include <cstring>
    const int INF=0x3f3f3f3f;
    int n,m,a,b,c,mp[105][105],ans;
    bool use[105];
    void dfs(int k,int l){
            for(int i=2;i<=n;i++)
            {
                    if(l>ans)   return;
                    if(k==n)
                    {
                            ans=l;
                            return;
                    }        
                    if(use[i]==false)
                    {
                            use[i]=true;
                            dfs(i,l+mp[k][i]);
                            use[i]=false;
                     }
            }
    }
    int main()
    {
            while(scanf("%d%d",&n,&m)!=EOF&&(n||m))
            {
                    ans=INF;
                    memset(mp,INF,sizeof(mp));
                    for(int i=1;i<=m;i++)
                    {
                            scanf("%d%d%d",&a,&b,&c);
                            if(mp[a][b]>c)
                                    mp[a][b]=mp[b][a]=c;
                    }
                    use[1]=true;
                    dfs(1,0);
                    printf("%d
    ",ans);
            }
    return 0;
    }

         弗  洛  伊  德(Floyd)

    Accepted 2544 31MS 1260K 600 B G++
    #include <cstdio>
    #include <cstring>
    using namespace std;
    const int INF=0x3f3f3f;
    int n,m,a,b,c,mp[105][105];
    int main()
    {
            int i,j,k;
            while(scanf("%d%d",&n,&m)!=EOF&&(m||n))
            {
                    memset(mp,INF,sizeof(mp));
                    for(int i=0;i<m;i++)
                    {
                            scanf("%d%d%d",&a,&b,&c);
                            if(mp[a][b]>c)
                                    mp[a][b]=mp[b][a]=c;
                    }
                    for(k=1;k<=n;k++)
                            for(i=1;i<=n;i++)
                                    for(j=1;j<=n;j++)
                                            if(mp[i][k]+mp[k][j]<mp[i][j])
                                                    mp[i][j]=mp[i][k]+mp[k][j];
                    printf("%d
    ",mp[1][n]);
            }
            return 0;
    }

     

     第 杰 斯 特 拉

    Accepted 2544 15MS 1260K 811 B G++
    #include<cstdio>
    #include <cstring>
    using namespace std;
    const int INF=0x3f3f3f3f;
    int ans[105],n,m,mp[105][105],a,b,c;
    bool use[105];
    void dij(){
        for(int i=2;i<=n;i++)
            ans[i]=mp[1][i];
        ans[1]=0;
        memset(use,true,sizeof(use));
        use[1]=false;
        for(int i=2;i<n;i++)
        {
            int v,f=INF;
            for(int j=1;j<=n;j++)
                if(ans[j]<=f&&use[j])
                {
                    f=ans[j];
                    v=j;
                }
            for(int j=1;j<=n;j++)
                if(ans[v]+mp[v][j]<ans[j])
                ans[j]=ans[v]+mp[v][j];
            use[v]=false;
        }
    }
    int main()
    {
        while(scanf("%d%d",&n,&m)!=EOF&&(n||m))
        {
            memset(mp,INF,sizeof(mp));
            for(int i=1;i<=m;i++)
            {
                scanf("%d%d%d",&a,&b,&c);
                if(mp[a][b]>c)
                   mp[a][b]=mp[b][a]=c;
            }
            dij();
            printf("%d
    ",ans[n]);
        }
        return 0;
    } 
    #include <iostream>
    #include <cstring>
    #include <cstdio>
    using namespace std;
    int mp[1002][1002];
    bool use[1002];
    int ans[1002];
    const int INF  = 0x3f3f3f3f;
    int n;
    void dij(int a){
        ans[a] = 0;//设定起点 
        for(int i = 1 ; i < n ; i++){
            int min1 = INF,min2;
            for(int j = 1 ; j <= n ; j++){
                if(use[j] && ans[j] < min1){
                    min1=ans[j];
                    min2=j;
                }
            }
            use[min2]=false;
            for(int j=1;j<=n;j++){
                if(min1+mp[min2][j] < ans[j]){
                    ans[j] = mp[min2][j] + min1;
                }
            }
        }
    }
    int main(){
        int t,s,d;
        while(scanf("%d%d%d",&t,&s,&d)!=EOF){
            memset(mp,INF,sizeof(mp));
            int x,y,time ;
            int max2 =0;
            for(int i = 0 ; i < t ; i++){
                scanf("%d%d%d",&x,&y,&time);
                int max1 = x > y ? x : y;
                max2 = max2 > max1 ? max2 : max1;
                if(mp[x][y]>time)
                   mp[x][y]=mp[y][x]=time;//录入地图 
            }
            n = max2;//记录ID最大的城市 
            int min1 = INF;
            int m[1003],n[1003];
            for(int i = 0 ; i < s ; i ++)
                scanf("%d",&m[i]);
            for(int i = 0 ;i < d ; i ++)
                scanf("%d",&n[i]);
            for(int i = 0 ; i < s ; i ++){
                memset(use,true,sizeof(use));
                memset(ans,INF-1,sizeof(ans));
                dij(m[i]);
                for(int j = 0 ; j < d ; j ++){
                    if( ans[n[j]] < min1 )//ans[n[j]]为到n[j]的距离,选取一个最小值 
                            min1 = ans[n[j]];
                }
            }
            printf("%d
    ",min1);
        }
        return 0;
    }
    起点终点不定的dij运用
    Accepted 2066 140MS 5680K 1494 B C++
  • 相关阅读:
    10th blog:箭头函数
    10th blog:Event Flow
    12th:MAP.API
    10th blog:For each···in / For···in / For···of
    10th blog:Object
    Web第九周作业:History of Program(1950--2020)
    Web作业:Regular Expression
    Web作业:specific word count (index of )
    Web第七周作业:DOM&BOM
    MAP
  • 原文地址:https://www.cnblogs.com/zptcszj/p/10695833.html
Copyright © 2020-2023  润新知