HDU 2066 一个人的旅行(最短路)
2017-11-08 11:14
369 查看
【题目链接】
http://acm.hdu.edu.cn/showproblem.php?pid=2066
http://acm.hdu.edu.cn/showproblem.php?pid=2066
题目意思
题目大意:给定n个城市,m条路(双向),每条路都有一个权值。现在给你多个起点一个终点,问最短路径是多少解题思路
由于是多个起点,所以初始最短路数组时每个起点都初始,然后按最短路来跑就可以了代码部分
#include <bits/stdc++.h> using namespace std; #define LL long long const int maxn=1005; const int INT=0x3f3f3f; int n,m,t; int a[maxn][maxn]; ///地图 int vis[maxn]; int dis[maxn]; ///存储最短路 int s[maxn]; ///存放起点 int d; int Dis() { for (int i=0; i<n; i++) ///多个起点更新dis数组初值 { dis[s[i]]=0; if (vis[s[i]]==2) ///判断是否为终点(初始化时标记了终点vis为2) return dis[s[i]]; else vis[s[i]]=1; for (int j=0;j<1001;j++) { if (dis[j]>a[s[i]][j]) dis[j]=a[s[i]][j]; } } int mi,j,e; for (int i=0; i<t-n; i++) { mi=INT; for (int k=0; k<1001; k++) { if (dis[k]<mi&&vis[k]!=1) { mi=dis[k]; j=k; } } dis[j]=mi; for (int k=0; k<1001; k++) { if (vis[k]!=1) { if (a[j][k]+dis[j]<dis[k]) dis[k]=a[j][k]+dis[j]; } } if (vis[j]==2) return dis[j]; else vis[j]=1; } return -1; } int main() { while(scanf("%d %d %d",&t,&n,&m)!=EOF) { memset(a,INT,sizeof(a)); memset(dis,INT,sizeof(dis)); memset(vis,0,sizeof(vis)); for (int i=0; i<t; i++) { int A,B,x; scanf("%d %d %d",&A,&B,&x); if (x<a[A][B]) { a[A][B]=x; a[B][A]=x; } } for (int i=0;i<n;i++) ///输入起点 { scanf("%d",&s[i]); } for (int i=0;i<m;i++) ///标记终点 { scanf("%d",&d); vis[d]=2; } int minn=Dis(); cout<<minn<<endl; } return 0; }
相关文章推荐
- HDU 2066 一个人的旅行【最短路 dijkstra & floyed & SPFA 】
- hdu 2066 一个人的旅行(最短路)
- HDU2066_一个人的旅行(Dijkstra最短路)
- hdu 2066 一个人的旅行(最短路+SPFA)
- HDU 2066 一个人的旅行(最短路的简单题)
- HDU 2066 一个人的旅行(最短路&Dijkstra)
- HDU 2066 一个人的旅行【最短路,多起点多终点,Dijkstra算法+spfa算法】
- HDU 2066 一个人的旅行【最短路,多起点多终点,Dijkstra算法+spfa算法】
- hdu-2066 一个人的旅行(最短路spfa)
- HDU-2066 一个人的旅行(最短路[Floyd])
- HDU 2066 一个人的旅行(单源最短路SPFA)
- HDU 2066 一个人的旅行 (单源最短路)
- HDU 2066一个人的旅行(dijk最短路)
- 【HDU - 2066 一个人的旅行】 最短路 dijkstra,spfa
- hdu 2066 一个人的旅行 (多源最短路 )
- HDU-2066 一个人的旅行(图论,Floyd ,最短路)
- HDU 2066-一个人的旅行(最短路Dijkstra)
- HDU-2066-一个人的旅行(最短路,dijkstra)
- HDU 2066 一个人的旅行(最短路)
- hdu 2066 一个人的旅行_最短路