旅行问题 (求最短路)

题目:给定一个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;
}

 

posted @ 2018-07-11 14:35  姿态H  阅读(308)  评论(0编辑  收藏  举报