Tranvick

Untitled

Dec 6th, 2011
181
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.25 KB | None | 0 0
  1. #include <cstdio>
  2. #include <algorithm>
  3. #define N 1111
  4. #define M 222222
  5. #define INF 1111111111
  6.  
  7. using namespace std;
  8.  
  9. int ef[M],es[M],ev[M],next[M],first[N],c,n,m,d[N],s;
  10. bool b[N];
  11.  
  12. void add(int x,int y,int z){
  13.     next[++c]=first[x];first[x]=c;
  14.     ef[c]=x;es[c]=y;ev[c]=z;
  15. }
  16.  
  17. void dist(int s){
  18.     for(int i=1;i<=n;i++) d[i]=INF;//заполняем бесконечностями массив расстояний
  19.     d[s]=0;//расстояние до стартовой естественно равно нулю
  20.     for (int i=1;i<=n;i++){
  21.         int mind=INF,u=0;//mind - сам минимум, u - его номер
  22.         for (int j=1;j<=n;j++)//находим среди непросмотренных вершину u с минимальным d[u]
  23.             if ((d[j]<mind || u==0) && !b[j]){
  24.                 u=j;
  25.                 mind=d[j];
  26.             }
  27.         b[u]=1;//помечаем ее как просмотренную
  28.         for (int h=first[u];h;h=next[h]) d[es[h]]=min(d[es[h]],d[u]+ev[h]);//пытаемся релаксировать все вершины ребрами, выходящими из u
  29.     }
  30. }
  31.  
  32. int main(){
  33.     scanf("%d%d%d",&n,&m,&s);
  34.     for (int i=1;i<=m;i++){
  35.         int x,y,z;
  36.         scanf("%d%d%d",&x,&y,&z);
  37.         add(x,y,z);
  38.     }
  39.     dist(s);
  40.     for (int i=1;i<=n;i++) printf("%d ",d[i]);
  41.     return 0;
  42. }
  43.  
Advertisement
Add Comment
Please, Sign In to add comment