Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- /* przyklad:
- 6 10
- 1 2 2
- 1 6 1
- 1 5 3
- 4 1 5
- 2 6 2
- 2 3 5
- 4 3 4
- 3 5 4
- 4 5 4
- 5 6 3
- */
- #include <iostream>
- #include <vector>
- #include <set>
- #include <cstdlib>
- using namespace std;
- const int INF=2333333;
- class graph
- {
- public:
- struct Kr
- {
- int to;
- int cena;
- Kr(int a, int b){to=a;cena=b;}
- };
- struct Ve
- {
- bool odw;
- vector<Kr> kr;
- int odl;
- int s;
- Ve(){odl=INF;odw=false;}
- };
- struct djcmp{
- bool operator () (Ve* a, Ve* b)
- {
- return a->odl<b->odl;
- }
- };
- vector<Ve> v;
- vector<Ve> v2;
- graph(int a){v.assign(a,Ve());v2.assign(a,Ve());}
- void add(int iOd, int iDo,int Cena)
- {
- v[iOd].kr.push_back(Kr(iDo,Cena));
- v[iDo].kr.push_back(Kr(iOd,Cena));
- }
- void Dijkstra()
- {
- set<Ve*,djcmp> kol;
- v[0].odl=0;
- v[0].s=-1;
- REP(i,v.size())
- kol.insert(&v[i]);
- Ve* p;
- while(!kol.empty())
- {
- p=*kol.begin();
- p->odw=true;
- cout<<"teraz przetwarzam "<<p-&v[0]<<"\n";
- if(p->s!=-1){//tworze minimalne drzewo rozpinajace
- v2[p-&v[0]].kr.push_back(Kr(p->s,p->odl));
- v2[p->s].kr.push_back(Kr(p-&v[0],p->odl));
- }
- kol.erase(kol.begin());
- REP(i,p->kr.size()){
- if(v[p->kr[i].to].odl > p->kr[i].cena && !v[p->kr[i].to].odw)
- {
- kol.erase(&v[p->kr[i].to]);//gdy jest tu pomija wierzcholek nr 2
- v[p->kr[i].to].odl = p->kr[i].cena;
- v[p->kr[i].to].s = int(p - &v[0]);
- //gdy dam tutaj erase pomija wierzchołka nr 3
- kol.insert(&v[p->kr[i].to]);
- }
- }
- }
- }
- };
- int main()
- {
- int n,m;
- cin>>n>>m;
- graph g(n);
- int a,b,c;
- REP(i,m)
- {
- cin>>a>>b>>c;
- g.add(a-1,b-1,c);
- }
- g.Dijkstra();
- for(int i=0; i < n; i++)
- {
- cout<<"ilosc krawedzi dla "<<i<<" to "<<g.v2[i].kr.size()<<"\n";
- }
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement