Cod sursă (job #665406)

Utilizator avatar ASN4999K Nuta Alexandru ASN4999K IP ascuns
Problemă Evacuare (lot liceu) Compilator cpp-32 | 1,59 kb
Rundă Arhiva de probleme Status evaluat
Dată 30 sept. 2022 22:30:01 Scor 20
#import<fstream>
#import<stack>
#import<vector>
#import<algorithm>
using namespace std;
struct edge
{
    int cost,to;
    edge(int t,int c)
    {
        to=t;
        cost=c;
    }
};

struct viz
{
    int dist,x;
    viz(int a,int d)
    {
        dist=d;
        x=a;
    }
};
main()
{
    ifstream cin("evacuare.in");
    ofstream cout("evacuare.out");
    int n,m,s;
    cin>>n>>m>>s;
    vector<vector<edge>>a(n+1);
    for(int i=0;i<m;i++)
    {
        int x,y;
        cin>>x>>y;
        a[x].push_back(edge(y,1));
        a[y].push_back(edge(x,1));
    }
    for(int i=1;i<=n;i++)
    {
        int x;
        cin>>x;
        a[i].push_back(edge(x,0));
    }
    for(auto &c:a)
    {
        reverse(c.begin(),c.end());
    }
    deque<viz>q;
    q.push_back(viz(s,0));
    vector<int>rez(n+1,2e9);
    rez[s]=0;
    while(!q.empty())
    {
        if(q.front().dist>rez[q.front().x])
        {
            continue;
        }
        if(q.front().dist<rez[q.front().x])
        {
            throw("wtf bro");
        }
        int x=q.front().x;
        q.pop_front();
        for(auto &c:a[x])
        {
            if(rez[x]+c.cost<rez[c.to])
            {
                rez[c.to]=rez[x]+c.cost;
                if(c.cost)
                {
                    q.push_back(viz(c.to,rez[c.to]));
                }
                else
                {
                    q.push_front(viz(c.to,rez[c.to]));
                }
            }
        }
    }
    for(int i=1;i<=n;i++)
    {
        cout<<rez[i]<<'\n';
    }
}