zoukankan      html  css  js  c++  java
  • 旅行问题 (求最短路)

    题目:给定一个n个顶点组成的带权有向图的距离矩阵d(i,j)(INF 表示没有边)。要求从顶点0出发,再回到顶点0 问所经过的边权重的最小值是多少

    5 8
    0 1 3
    0 3 4
    1 2 5
    2 0 4
    2 3 5
    3 4 3
    4 1 6
    4 0 7

    12

    数据范围很大,所以用了dijkstr的优化版

    代码:

    #include<iostream>
    #include<cstdio>
    #include<cstring>
    #include<cmath>
    #include<queue>
    #include<set>
    #include<algorithm>
    #include<map>
    #define maxn 2005
    #define inf 1000000007
    typedef long long ll;
    using namespace std;
    int d[maxn][maxn];
    int dp[maxn][maxn];
    int a[maxn],b[maxn],c[maxn],n,m;
    vector<pair<int ,int> >e[maxn];//建立图
    int dis[maxn];
    void init()
    {
        for(int i=0;i<maxn;i++)
            e[i].clear();
        for(int i=0;i<maxn;i++)
            dis[i]=inf;
    }
    void dijkstra(int s)
    {
       priority_queue<pair<int,int> >q;
       dis[s]=0;
       q.push(make_pair(-dis[s],s));
       while(!q.empty())
       {
           int now=q.top().second;
           q.pop();
           for(int i=0;i<e[now].size();i++)
           {
               int v=e[now][i].first;//为了用起来方便而赋值
               if(dis[v]>dis[now]+e[now][i].second)//更新顶点的dis值
               {
                   dis[v]=dis[now]+e[now][i].second;
                   q.push(make_pair(-dis[v],v));
               }
           }
       }
    }
    int main()
    {
        cin>>n>>m;
         init();
        for(int i=0;i<m;i++)
        {
              int x,y,z;
            scanf("%d %d %d",&x,&y,&z);
            e[x].push_back(make_pair(y,z));//e[x].push_back(y);
           // e[y].push_back(make_pair(x,z));
        }
        int k=0;
        for( int i=0;i<n;i++)
            for(int j=0;j<e[i].size();i++)
        {
            if(e[i][j].first==0) {a[k]=i;b[k]=e[i][j].second;k++;}
        }
    //    for(int i=0;i<k;i++)
    //    {
    //        cout<<a[i]<<" "<<b[i]<<endl;
    //    }
        int  maxx=inf;
                dijkstra(0);
        //        cout<<dis[2];
        for(int i=0;i<k;i++)
        {
            c[i]=dis[a[i]]+b[i];
            if(c[i]<maxx)maxx=c[i];
        }
        cout<<maxx<<endl;
    //    solve();
        return 0;
    }
  • 相关阅读:
    移动端WEB开发真机测试
    前端自学路线之js篇
    学习提高你CSS技术的法则
    day-5元组专区
    day5-列表专区
    day4-字符串专区
    day2-day3基本数据类型专区
    day1-习题
    day1-python条件语句和基本数据类型
    day1-python初识以及变量
  • 原文地址:https://www.cnblogs.com/huangzzz/p/9294342.html
Copyright © 2011-2022 走看看