Tranvick

Untitled

Dec 2nd, 2011
184
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.31 KB | None | 0 0
  1. #include <cstdio>
  2. #include <queue>
  3. #define N 1111
  4. #define M 222222
  5. using namespace std;
  6.  
  7. int d[N],n,ef[M],es[M],ev[M],next[M],first[N],c,m;
  8. queue<int> q;
  9.  
  10. void add(int x,int y,int z){
  11.     next[++c]=first[x];first[x]=c;
  12.     ef[c]=x;es[c]=y;ev[c]=z;
  13. }
  14.  
  15. void bfs(int s){
  16.     for (int i=1;i<=n;i++) d[i]=1<<30; // заполняем массив расстояний бесконечностями. 2^30 > 1 000 000 000
  17.     d[s]=0;q.push(s); // ложим в очередь. Делаем расстояние до старта равным нулю.
  18. // Из-за этого у тебя вчера ни капли не работало, ты изначально расстояние до всех вершин сделала бесконечностями
  19.     while (!q.empty()){
  20.         int v=q.front();q.pop();
  21.         for (int h=first[v];h;h=next[h])
  22.             if (d[es[h]]>d[v]+ev[h]){ //вся логика программы в этой строчке. Тут вселенский смысл
  23. // и тайна конца света 2012. Допустим мы раньше уже были в вершне es[h]. Но теперь мы пришли туда с меньшей стоимостью,
  24. // чем это было раньше. Тогда нам надо заново пройтись из этой вершины и уменьшить все расстояния. То есть очевидно,
  25. // что некоторые вершины мы можем посетить много-много раз, поэтому очень медленно может выйти. Хотя если повезет,
  26. // то для некоторых тестов это будет работать за вполне приемлемое время.
  27.                 d[es[h]]=d[v]+ev[h];// улучшаем текущее расстояние. Это называется релаксацией, если что.
  28.                 q.push(es[h]);// кладем в очередь.
  29.             }
  30.     }
  31. }
  32.  
  33. int main(){
  34.     freopen("input.txt","r",stdin);
  35.     int s,t;
  36.     scanf("%d%d%d%d",&n,&m,&s,&t);
  37.     for (int i=1;i<=m;i++){
  38.         int x,y,z;
  39.         scanf("%d%d%d",&x,&y,&z);
  40.         add(x,y,z); // Вот тебе вопрос - какой у нас граф получается? По вводу видно.
  41. //Заодно узнаю, читала ли ты комменты =)
  42.     }
  43.     bfs(s);
  44.     printf("%d",d[t]);
  45.     return 0;
  46. }
  47.  
Advertisement
Add Comment
Please, Sign In to add comment