[HDU 2066] 多个最短路比较大小

来源:互联网 发布:linux 格式化硬盘 编辑:程序博客网 时间:2024/06/05 12:07

把小草家到中转站的距离看为0 ; 然后从家里开始最短路就行了 ; 

然后比较想去的点的最短路径输出最小的;

#include <bits/stdc++.h>#define inf 9999999using namespace std ;int v , u , n , dis[2000] , ma[2000][2000] , vis[2000] , sa[2000] ; int s , t , d ;void init();//*初始化 void input();//*读入t组数据存图  void clear();//*读入s组数据代表路 void inin();//*读入d组数据代表想去的 void dijk();//*求最短路 void maxn();//*比较可以去的地方的所有最短路 int main(){while(scanf("%d%d%d",&t,&s,&d)!=EOF){init();input();clear();inin();dijk();maxn();}return 0 ;}void init(){memset(vis,0,sizeof(vis));memset(sa,0,sizeof(sa));for(int i = 0 ; i<=1500;i++){for(int j = 0 ; j <=1500 ; j++){ma[i][j] = inf ;}dis[i] = inf ;ma[i][i] = 0 ;}}void input(){n = 0 ;for(int i = 0 ; i < t ; i++){int a , b , c ;scanf("%d%d%d",&a,&b,&c);n = max(n,max(a,b));if(ma[a][b] > c){ma[a][b] = ma[b][a] = c ;}}}void clear(){for(int i = 0 ; i < s ; i++){int m ;scanf("%d",&m);ma[0][m] = ma[m][0] = 0 ;}}void inin(){for(int i = 0 ; i < d ;i++){scanf("%d",&sa[i]);}}void dijk(){vis[0] = 1 ;for(int i = 0 ; i <=n ; i++){dis[i] = ma[0][i] ;}int mini , k ;for(int i = 1 ; i<=n ;i++){mini = inf ;for(int j = 1 ;j<=n;j++){if(!vis[j]&&dis[j] < mini){mini = dis[j] ;k = j ;}}vis[k] = 1;for(int j = 1 ;j<=n;j++){if(!vis[j]&&dis[j] > dis[k] + ma[k][j]){dis[j] = dis[k] + ma[k][j] ;}}}}void maxn(){int maxi = inf ;for(int i = 0 ; i < d ; i++){maxi = min(maxi , dis[sa[i]]);}cout<<maxi<<endl;}



0 0
原创粉丝点击