zoukankan      html  css  js  c++  java
  • HDU2145 SPFA

    题意:给定一些人,这些人要到同一个地点去,求最先到达的人。

    spfa(反向加边就行) 水~

    View Code
      1 #include<stdio.h>
      2 #include<string.h>
      3 #include<stdlib.h>
      4 #include<queue>
      5 #include<algorithm>
      6 using namespace std;
      7 const int maxn = 315;
      8 const int maxm = 5015;
      9 const int inf = 9999999;
     10 int cnt,head[ maxn ];
     11 int n,m,k;
     12 int dis[ maxn ],vis[ maxn ];
     13 struct node{
     14     int u,val,next;
     15 }edge[ maxm ];
     16 struct node2{
     17     int city_number,dis;
     18     double speed,time;
     19     int p_number;//p_number is for the number of the people
     20 }p[ maxn ];
     21 void init(){
     22     cnt=0;
     23     memset( head,-1,sizeof( head ));
     24 }
     25 void addedge( int a,int b,int c ){
     26     edge[ cnt ].u=b;
     27     edge[ cnt ].val=c;
     28     edge[ cnt ].next=head[ a ];
     29     head[ a ]=cnt++;
     30 }
     31 int cmp( node2 a,node2 b ){
     32     if( a.time!=b.time )
     33         return a.time<b.time;
     34     else if( a.dis!=b.dis )
     35         return a.dis>b.dis;
     36     else
     37         //return a.city_number>b.city_number;
     38         return a.p_number>b.p_number;
     39 }
     40 
     41 void spfa( int s ){
     42     for( int i=1;i<=n;i++ ){
     43         dis[ i ]=inf;
     44         vis[ i ]=0;
     45     }
     46     queue<int>q;
     47     while( !q.empty() )
     48         q.pop();
     49     dis[ s ]=0;
     50     vis[ s ]=1;
     51     q.push( s );
     52     while( !q.empty() ){
     53         int now=q.front();
     54         q.pop();
     55         vis[ now ]=0;
     56         for( int i=head[ now ];i!=-1;i=edge[ i ].next ){
     57             int next=edge[ i ].u;
     58             if( dis[ next ]>dis[ now ]+edge[ i ].val ){
     59                 dis[ next ]=dis[ now ]+edge[ i ].val;
     60                 if( vis[ next ]==0 ){
     61                     vis[ next ]=1;
     62                     q.push( next );
     63                 }
     64             }
     65         }
     66     }
     67     return ;
     68 }
     69 
     70 int main(){
     71     while( scanf("%d%d%d",&n,&m,&k)!=EOF ){
     72         int a,b,c;
     73         init();
     74         while( k-- ){
     75             scanf("%d%d%d",&a,&b,&c);
     76             addedge( b,a,c );//change the dir
     77         }
     78         int zz_pos;
     79         scanf("%d",&zz_pos);
     80         for( int i=1;i<=m;i++ ){
     81             scanf("%d",&p[i].city_number);
     82         }
     83         for( int i=1;i<=m;i++ ){
     84             scanf("%lf",&p[i].speed);
     85         }
     86         spfa( zz_pos );//the aim to all the vet,get dis[ maxn ]
     87         for( int i=1;i<=m;i++ ){
     88             p[i].p_number=i;
     89             if( dis[ p[i].city_number ]>=inf ){
     90                 p[i].time=1.0*inf;
     91                 p[i].dis=inf;
     92             }
     93             else{
     94                 p[i].dis=dis[ p[i].city_number ];
     95                 p[i].time=dis[ p[i].city_number ]*1.0/(1.0*p[i].speed);
     96             }
     97         }
     98         sort( p+1,p+1+m,cmp );
     99         if( p[1].time>=(1.0*inf) ){
    100             printf("No one\n");
    101         }
    102         else{
    103             printf("%d\n",p[1].p_number);
    104         }
    105     }
    106     return 0;
    107 }
    keep moving...
  • 相关阅读:
    MOOK学习
    寒假学习计划
    三位影响深刻的老师
    软工第三次作业-结对作业
    2018软工实践第二次作业
    2018软工实践第一次作业
    简单的自我介绍
    福大软工1816 · 第一次作业
    课程作业八
    课程作业七
  • 原文地址:https://www.cnblogs.com/xxx0624/p/2924700.html
Copyright © 2011-2022 走看看