Cod sursa(job #407369)

Utilizator raica_cristiraica dumitru cristian raica_cristi Data 2 martie 2010 11:45:38
Problema Algoritmul lui Dijkstra Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 2.05 kb
#include<stdio.h>
#include<ctype.h>
#include<vector>
#include<queue>

using namespace std;
#define mp make_pair
#define fs first
#define sc second
#define pb push_back
#define dim 50050
#define inf 0x3f3f3f3f
#define buf 400000
queue <int> q;
vector <pair<int,int> > v[dim];
int n,m,dst [ dim ],k;
char s[ buf+1];
void r( int &val)
{
     while( !isdigit( s[k] ))
            if( ++k == buf )
            {
                k=0;
                fread( s, 1, buf ,stdin);
                }
     val =0 ;
     while( isdigit( s[k] ) )
     {
            val= val*10 + s[k] - '0';
            if ( ++k == buf )
            {
                 k=0;
                 fread ( s,1,buf, stdin);
                 }
             }
            }

inline void add(int &x,int &y, int &c)
{
       v[x].pb(mp(y,c));
}
inline void read()
{
     int x,y,c;
     r( n ) ;
     r( m ) ;
     for(int i=1; i<=m; i++)
     {
            // scanf("%d%d%d",&x,&y,&c);
             r(x);
             r(y);
             r(c);
             add( x, y ,c);
     }
     
}
void solve()
{
     int nod;
     memset ( dst , inf, sizeof(dst));
     dst[ 1 ]=0;
     for( q.push (1) ; !q.empty(); q.pop() )
     {
          nod = q.front ();
          for(int i= 0 ; i< v[nod].size(); i ++)
          {
                //  printf("%d %d\n",nod ,dst [ nod ]);
               //   printf("%d= %d+ %d\n",dst[ v[nod][i].fs ], v[ nod ][ i ].sc , dst[ nod ]);
                  if ( dst[ v[nod][i].fs ]> v[ nod ][ i ].sc + dst[ nod ])
                  {
                        dst[ v[nod][i].fs ] = v[ nod ][ i ].sc + dst[ nod ];
                        q.push(v[ nod ][ i ].fs)  ;
                       
                        }
                  }
                  
      }
      for(int i=2 ;i<=n;i++)
      if ( dst[i] != inf)
      printf("%d ",dst[i]);
      else
      printf("0 ");
      printf("\n");
}
int main ()
{
    freopen("dijkstra.in","r",stdin);
    freopen("dijkstra.out","w",stdout);
    read();
    solve();
    return 0;
}