旅行问题 (求最短路)
题目:给定一个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; }