Cod sursa(job #1076335)

Utilizator calin13Calin Nicolau calin13 Data 10 ianuarie 2014 01:25:39
Problema BFS - Parcurgere in latime Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.77 kb
#include <iostream>
#include <fstream>
#include <cstring>
#include <vector>
#include <queue>
#include <bitset>
#include <list>
#include <algorithm>
#include <string>
using namespace std;
#define INF 0xFFFFFFFF
unsigned int n, m , s;
vector< list<unsigned int> > a(100005);
vector< unsigned int > d(100005);

class cApp
{
public:
    cApp(const char *filename)
    {
        char inFile[30];
        strcpy(inFile, filename);
        strcat(inFile, ".in");
        char outFile[30];
        strcpy(outFile, filename);
        strcat(outFile, ".out");
        f.open(inFile, ios_base::in);
        g.open(outFile, ios_base::out);
    }
    ~cApp()
    {
        f.close();
        g.close();
    }
    void read()
    {
        f >> n >> m >> s;
        unsigned int x, y;
        for (unsigned int i = 1; i <= m; ++i)
        {
            f >> x >> y;
            a[x].push_front(y);
        }
    }
    void write()
    {
        for(unsigned int i = 1; i <= n; ++i)
        if (d[i] == INF)
            g << -1 << " ";
        else
            g << d[i] << " ";
    }
    fstream f, g;
};

void bfs()
{
    queue< unsigned int > q;
    bitset<100005> viz;

    for (unsigned int i = 1; i <= n; ++i)
        d[i] = INF;
    viz[s] = 1;
    d[s] = 0;
    q.push(s);
    while (!q.empty())
    {
        for(list<unsigned int>::iterator it = a[ q.front() ].begin();
                it != a[ q.front() ].end();
                ++it)
            if ( !viz[*it] )
            {
                viz[*it] = 1;
                d[*it] = d
                [q.front()] + 1;
                q.push(*it);
            }
        q.pop();
    }
}
int main()
{
    cApp app("bfs");
    app.read();
    bfs();
    app.write();
    return 0;
}