2525 2023. 01. 16 09:52:34 kicsiboglar Adószedő cpp11 Elfogadva 30/30 112ms 29496 KiB
#include <iostream>
//#include <fstream>
#include <vector>
#include <deque>
#include <queue>
#include <climits>

#define ll long long 

using namespace std;
//ifstream cin ("input.in");
//ofstream cout ("output.out");

ll n,m,i,j,a,b,start;
struct element
{
    bool seen;
    ll step=LLONG_MAX,from=-1;
    vector <ll> sz;
};


vector <pair<ll,ll> > res;

struct road
{
    ll where,steps,from;
};

priority_queue<road> que;
bool operator< (const road& a, const road& b)
{
    return a.steps>b.steps;
}

int main()
{
    ios_base::sync_with_stdio(false);
    cin.tie(0); cout.tie(0);

    cin>>n>>m>>start;
    vector <element> x(n+1);
    deque<pair<ll,ll> >v;
    for (i=1;i<=m;++i)
    {
        cin>>a>>b;
        x[a].sz.push_back(b);
        x[b].sz.push_back(a);
    }

    x[start].step=0;
    que.push({start,0,0});
    //v.push_back(start);
    //x[start].seen=true;
    ll db=0;
    road curr;
    while (!que.empty())
    {
        curr=que.top();
        while (x[curr.where].seen&&!que.empty())
        {
            que.pop();
            if (!que.empty()) curr=que.top();
        }

        if (que.empty()) break;
       //db++;
        x[curr.where].seen=true;
        x[curr.where].step=curr.steps;
        x[curr.where].from=curr.from;
        //res.push_back({curr.where,curr.from});
        for (auto &e:x[curr.where].sz)
        {
            if (curr.steps+1<x[e].step)
            {
                x[e].step=curr.steps+1;
                que.push({e,curr.steps+1,curr.where});
            }
        }
    }

    v.push_back({start,0});
    pair<ll,ll> r;
    for (i=1;i<=n;++i) x[i].seen=false;
    x[start].seen=true;
    while (!v.empty())
    {
        r=v[0];
        v.pop_front();

        for (auto& e:x[r.first].sz)
        {
            if (x[e].step==r.second+1)
            {
                res.push_back({e,r.first});
                if (!x[e].seen)
                {
                    x[e].seen=true;
                    v.push_back({e,x[e].step});
                }
            }
        }
    }

    cout<<res.size()<<"\n";
    for (auto&e:res) cout<<e.first<<" "<<e.second<<"\n";
}
Részfeladat Összpont Teszt Verdikt Idő Memória
base 30/30
1 Elfogadva 0/0 3ms 2108 KiB
2 Elfogadva 0/0 86ms 20616 KiB
3 Elfogadva 1/1 2ms 2532 KiB
4 Elfogadva 1/1 2ms 2604 KiB
5 Elfogadva 1/1 2ms 2736 KiB
6 Elfogadva 1/1 2ms 2792 KiB
7 Elfogadva 1/1 2ms 2900 KiB
8 Elfogadva 1/1 2ms 3132 KiB
9 Elfogadva 2/2 3ms 3440 KiB
10 Elfogadva 2/2 3ms 3572 KiB
11 Elfogadva 2/2 3ms 3984 KiB
12 Elfogadva 2/2 8ms 5192 KiB
13 Elfogadva 2/2 17ms 7520 KiB
14 Elfogadva 2/2 72ms 18560 KiB
15 Elfogadva 1/1 96ms 29496 KiB
16 Elfogadva 1/1 82ms 20744 KiB
17 Elfogadva 2/2 112ms 29108 KiB
18 Elfogadva 2/2 97ms 26872 KiB
19 Elfogadva 2/2 108ms 27916 KiB
20 Elfogadva 2/2 101ms 28556 KiB
21 Elfogadva 2/2 108ms 29276 KiB