Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <cstdio>
- #include <queue>
- #define N 1111
- #define M 222222
- using namespace std;
- int d[N],n,ef[M],es[M],ev[M],next[M],first[N],c,m;
- queue<int> q;
- void add(int x,int y,int z){
- next[++c]=first[x];first[x]=c;
- ef[c]=x;es[c]=y;ev[c]=z;
- }
- void bfs(int s){
- for (int i=1;i<=n;i++) d[i]=1<<30; // заполняем массив расстояний бесконечностями. 2^30 > 1 000 000 000
- d[s]=0;q.push(s); // ложим в очередь. Делаем расстояние до старта равным нулю.
- // Из-за этого у тебя вчера ни капли не работало, ты изначально расстояние до всех вершин сделала бесконечностями
- while (!q.empty()){
- int v=q.front();q.pop();
- for (int h=first[v];h;h=next[h])
- if (d[es[h]]>d[v]+ev[h]){ //вся логика программы в этой строчке. Тут вселенский смысл
- // и тайна конца света 2012. Допустим мы раньше уже были в вершне es[h]. Но теперь мы пришли туда с меньшей стоимостью,
- // чем это было раньше. Тогда нам надо заново пройтись из этой вершины и уменьшить все расстояния. То есть очевидно,
- // что некоторые вершины мы можем посетить много-много раз, поэтому очень медленно может выйти. Хотя если повезет,
- // то для некоторых тестов это будет работать за вполне приемлемое время.
- d[es[h]]=d[v]+ev[h];// улучшаем текущее расстояние. Это называется релаксацией, если что.
- q.push(es[h]);// кладем в очередь.
- }
- }
- }
- int main(){
- freopen("input.txt","r",stdin);
- int s,t;
- scanf("%d%d%d%d",&n,&m,&s,&t);
- for (int i=1;i<=m;i++){
- int x,y,z;
- scanf("%d%d%d",&x,&y,&z);
- add(x,y,z); // Вот тебе вопрос - какой у нас граф получается? По вводу видно.
- //Заодно узнаю, читала ли ты комменты =)
- }
- bfs(s);
- printf("%d",d[t]);
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment