#include <iostream>
#include <cstdio>
#include <vector>
#include <queue>
using namespace std;
int ilosc_drog[200002];
int kandydaci[200002];
int odleglosci[200002];
vector < vector <int> >graf(200001);
vector < vector <int> >wyniki(200001);
queue <int> kolejka;
int main()
{
int n,m,d,n1,n2;
int licznik_miast=0;
int v;
scanf("%d%d%d",&n,&m,&d);
for (int i=1;i<=m;i++)
{
scanf("%d%d",&n1,&n2);
ilosc_drog[n1]++;ilosc_drog[n2]++;
graf[n1].push_back(n2);
graf[n2].push_back(n1);
}
for(int i=1;i<=n;i++)
{
if(ilosc_drog[i]>=d)
{
licznik_miast++;
kandydaci[licznik_miast]=i;
}
}
if (licznik_miast<2) {cout<<"NIE"; return 0;}
/* cout<<"sasiedzi:"<<endl;
for (int i=1;i<=n;i++)
{
for(int j=0;j<graf[i].size();j++)
cout<<graf[i][j]<<" ";
cout<<endl;
}
cout<<"ilosc drog "<<endl;
for(int i=1;i<=n;i++)
cout<<ilosc_drog[i]<<" ";
cout<<endl<<"kandydaci"<<endl;
for(int i=1;i<=licznik_miast;i++)
cout<<kandydaci[i]<<" "; */
////////////////////////////////////////////////////////////////////////////////////
bool koniec=false;
int nowy_poczatek=kandydaci[1];
int runda=0,maksi=0,runda_zw;
while(!koniec)
{
odleglosci[nowy_poczatek]=1;
for(int i=0;i<graf[nowy_poczatek].size();i++)
if(ilosc_drog[graf[nowy_poczatek][i]]>=d) kolejka.push(graf[nowy_poczatek][i]);
//cout<<endl;
while (!kolejka.empty())
{
//cout<<" "<<kolejka.front();
//kolejka.pop();
v=kolejka.front();
if(!odleglosci[v]) odleglosci[v]++;
kolejka.pop();
for(int i=0; i<graf[v].size();i++)
if(ilosc_drog[graf[v][i]]>=d && odleglosci[graf[v][i]]==0)
kolejka.push(graf[v][i]);
}
int licznik_ok=0,licznik_nieok=0;
for(int i=1;i<=licznik_miast;i++)
if(odleglosci[kandydaci[i]]>0) licznik_ok++;
else {licznik_nieok++; nowy_poczatek=kandydaci[i];}
// cout<<licznik_ok<<" nieok "<<licznik_nieok<<endl;
if(licznik_ok>=licznik_nieok && licznik_ok>=maksi)
{
cout<<licznik_ok<<endl;
for(int i=1;i<=licznik_miast; i++)
if(odleglosci[kandydaci[i]]>0) cout<<kandydaci[i]<<" ";
koniec=true;
return 0;
} else
{
if(licznik_ok>maksi) {maksi=licznik_ok; runda_zw=runda;}
koniec=false;
for(int i=1;i<=licznik_miast; i++)
if(odleglosci[kandydaci[i]]>0) wyniki[runda].push_back(kandydaci[i]);
for(int i=1;i<=licznik_miast;i++)
odleglosci[kandydaci[i]]=0;
}
}
cout<<wyniki[runda_zw].size()<<endl;
for(int i=0;i<wyniki[runda_zw].size();i++)
cout<<wyniki[runda_zw][i]<<" ";
return 0;
}
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 | #include <iostream> #include <cstdio> #include <vector> #include <queue> using namespace std; int ilosc_drog[200002]; int kandydaci[200002]; int odleglosci[200002]; vector < vector <int> >graf(200001); vector < vector <int> >wyniki(200001); queue <int> kolejka; int main() { int n,m,d,n1,n2; int licznik_miast=0; int v; scanf("%d%d%d",&n,&m,&d); for (int i=1;i<=m;i++) { scanf("%d%d",&n1,&n2); ilosc_drog[n1]++;ilosc_drog[n2]++; graf[n1].push_back(n2); graf[n2].push_back(n1); } for(int i=1;i<=n;i++) { if(ilosc_drog[i]>=d) { licznik_miast++; kandydaci[licznik_miast]=i; } } if (licznik_miast<2) {cout<<"NIE"; return 0;} /* cout<<"sasiedzi:"<<endl; for (int i=1;i<=n;i++) { for(int j=0;j<graf[i].size();j++) cout<<graf[i][j]<<" "; cout<<endl; } cout<<"ilosc drog "<<endl; for(int i=1;i<=n;i++) cout<<ilosc_drog[i]<<" "; cout<<endl<<"kandydaci"<<endl; for(int i=1;i<=licznik_miast;i++) cout<<kandydaci[i]<<" "; */ //////////////////////////////////////////////////////////////////////////////////// bool koniec=false; int nowy_poczatek=kandydaci[1]; int runda=0,maksi=0,runda_zw; while(!koniec) { odleglosci[nowy_poczatek]=1; for(int i=0;i<graf[nowy_poczatek].size();i++) if(ilosc_drog[graf[nowy_poczatek][i]]>=d) kolejka.push(graf[nowy_poczatek][i]); //cout<<endl; while (!kolejka.empty()) { //cout<<" "<<kolejka.front(); //kolejka.pop(); v=kolejka.front(); if(!odleglosci[v]) odleglosci[v]++; kolejka.pop(); for(int i=0; i<graf[v].size();i++) if(ilosc_drog[graf[v][i]]>=d && odleglosci[graf[v][i]]==0) kolejka.push(graf[v][i]); } int licznik_ok=0,licznik_nieok=0; for(int i=1;i<=licznik_miast;i++) if(odleglosci[kandydaci[i]]>0) licznik_ok++; else {licznik_nieok++; nowy_poczatek=kandydaci[i];} // cout<<licznik_ok<<" nieok "<<licznik_nieok<<endl; if(licznik_ok>=licznik_nieok && licznik_ok>=maksi) { cout<<licznik_ok<<endl; for(int i=1;i<=licznik_miast; i++) if(odleglosci[kandydaci[i]]>0) cout<<kandydaci[i]<<" "; koniec=true; return 0; } else { if(licznik_ok>maksi) {maksi=licznik_ok; runda_zw=runda;} koniec=false; for(int i=1;i<=licznik_miast; i++) if(odleglosci[kandydaci[i]]>0) wyniki[runda].push_back(kandydaci[i]); for(int i=1;i<=licznik_miast;i++) odleglosci[kandydaci[i]]=0; } } cout<<wyniki[runda_zw].size()<<endl; for(int i=0;i<wyniki[runda_zw].size();i++) cout<<wyniki[runda_zw][i]<<" "; return 0; } |
English