Pagini: 1 ... 3 4 [5] 6 7 8   În jos
  Imprimă  
Ajutor Subiect: 009 Algoritmul lui Dijkstra  (Citit de 117913 ori)
0 Utilizatori şi 1 Vizitator pe acest subiect.
Bogdan_tmm
De-al casei
***

Karma: 4
Deconectat Deconectat

Mesaje: 122



Vezi Profilul
« Răspunde #100 : Ianuarie 21, 2011, 00:10:44 »

Este exagerata limita de timp, din cate am vazut intra mai bine o coada simpla decat un heap.
Memorat
mening12001
Strain


Karma: -13
Deconectat Deconectat

Mesaje: 14



Vezi Profilul
« Răspunde #101 : Ianuarie 25, 2011, 19:33:40 »

Conform "verificatorului" acest algoritm este gresit (wrong answer)

Asa fiind...poate sa'mi explice cineva unde imi este gresit rationamentul ?

Cod:
#include<iostream.h>
#include<fstream.h>
long long a[9000][9000];
int main()
{int i,j,k,n,m,x,y,z;

ifstream f("dijkstra.in");
ofstream h("dijkstra.out");
f>>n>>m;

for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
a[i][j]=10000;


for(i=1;i<=m;i++)
{ f>>x>>y>>z;
a[x][y]=z;}
for(k=1;k<=n;k++)
for(j=1;j<=n;j++)
 if(a[1][k]+a[k][j]<a[1][j]&&i!=k&&j!=k)
a[1][j]=a[1][k]+a[k][j];
for(i=2;i<=n;i++)
h<<a[1][i]<<" ";


return 0;}
Modificat de Moderator: Nu mai posta consecutiv si foloseste tag-ul [ code ] ... [ / code ] cand scrii surse
« Ultima modificare: Ianuarie 25, 2011, 21:27:33 de către Mircea Dima » Memorat
pauldb
Nu mai tace
*****

Karma: 821
Deconectat Deconectat

Mesaje: 1.901



Vezi Profilul
« Răspunde #102 : Ianuarie 25, 2011, 22:25:00 »

Fara sa ma uit prea atent observ doua probleme majore in programul tau: folosesti prea multa memorie si complexitate timp prea mare. In rest, poti lua testele (sunt publice) si sa vezi unde nu-ti da bine.
Memorat

Am zis Mr. Green
maoo
Strain


Karma: 0
Deconectat Deconectat

Mesaje: 4



Vezi Profilul
« Răspunde #103 : Ianuarie 31, 2011, 20:50:43 »

imi poate spune si mie cineva de ce imi da incorect pe acest cod daca rezultatul e la fel cu cel de la raspunsuri
Cod:
#include<fstream>
#include<cstdio>
#include<vector>
#include<utility>
#define ff it->first
#define ss it->second

using namespace std;
int n,m,a,b,c,d[50005],oo=500000000,h[50010],poz[50010],i,l,nod,dist;
void read(),solve(),percolate(int t),sift(int f);
vector <pair<int,int> > v[50010];


int main()
{

read();
solve();
return 0;
}
void read()
{
ifstream in("dijkstra.in");
in>>n>>m;
for(;m;m--)
{
in>>a>>b>>c;
v[a].push_back(make_pair(b,c));
}
in.close();
}
void solve()
{
vector<pair<int,int> >::iterator it;
ofstream out("dijkstra.out");
for(i=1;i<=n;i++)
{
h[i]=i;
d[i]=oo;
poz[i]=i;
}
d[1]=0;
l=n;
for(;l;)
{
nod=h[1];
dist=d[nod];
for(it=v[nod].begin();it!=v[nod].end();it++)
if(d[ff]>dist+ss)
{
d[ff]=dist+ss;
percolate(poz[ff]);
}
h[1]=h[l];
poz[h[1]]=1;
l--;
sift(1);
}
for(i=2;i<=n;i++)
{
if(d[i]==oo)
d[i]=0;
}
for(i=2;i<=n;i++)
out<<d[i]<<" ";
out.close();
}
void percolate(int f)
{
int t,aux;
for(;;)
{
t=f>>1;
if(d[h[t]]<=d[h[f]])
return;
aux=h[t];
h[t]=h[f];
h[f]=aux;
poz[h[t]]=t;
poz[h[f]]=f;
f=t;
}
}
void sift(int t)
{
int f,aux;
for(;;)
{
f=t<<1;
if(f>l)
return;
if(f<l)
if(d[h[f]]<d[h[f+1]])
f++;
if(d[h[t]]<=d[h[f]])
return;
aux=h[t];
h[t]=h[f];
h[f]=aux;
poz[h[t]]=t;
poz[h[f]]=f;
t=f;
}
}
Memorat
PlayLikeNeverB4
Nu mai tace
*****

Karma: 212
Deconectat Deconectat

Mesaje: 721



Vezi Profilul
« Răspunde #104 : Februarie 01, 2011, 00:21:32 »

Daca iti da corect pe exemplul de la problema nu inseamna ca iti da pentru toate Smile

Nu introdu toate nodurile de la inceput, doar pe cele pe care le-ai vizitat. Le introduci pe parcurs pe fiecare.
Asta e greseala cea mai mare... In rest, am modificat <= in < si >= in > (nu ma intreba de ce, dar a facut diferenta de la 80 la 90...). N-am putut pana la 100, dar vezi tu...

Sursa ta modificata: http://infoarena.ro/job_detail/527679?action=view-source
Memorat
maoo
Strain


Karma: 0
Deconectat Deconectat

Mesaje: 4



Vezi Profilul
« Răspunde #105 : Februarie 01, 2011, 08:48:03 »

bine dar faza este ca mie imi afiseaza ce trebuie la primul exemplu dar imi zice ca e incorect shi imi ia 10 puncte pe la testu 7
http://infoarena.ro/job_detail/527540 asta e mesajul de la evaluator Brick wall
Memorat
gabitzish1
Moderatori infoarena
Nu mai tace
*****

Karma: 321
Deconectat Deconectat

Mesaje: 926



Vezi Profilul
« Răspunde #106 : Februarie 01, 2011, 10:49:12 »

Sa inteleg ca pe testul asta :

Cod:
7 9
1 4 2
1 2 1
2 3 3
4 3 1
3 5 2
5 6 5
6 3 1
3 7 2
1 5 9

rezultatul tau e
Cod:
1 3 2 5 10 5 

si iei 0 puncte pe primul test?
Memorat
PlayLikeNeverB4
Nu mai tace
*****

Karma: 212
Deconectat Deconectat

Mesaje: 721



Vezi Profilul
« Răspunde #107 : Februarie 01, 2011, 13:29:29 »

Nu iti afiseaza ce trebuie... Am verificat si eu inainte.

Iti da asa la primul: 1 3 2 5 14 5

Mai verifica odata Smile
Memorat
maoo
Strain


Karma: 0
Deconectat Deconectat

Mesaje: 4



Vezi Profilul
« Răspunde #108 : Februarie 02, 2011, 20:55:19 »

Eu ma gandeam ca este ca la .campion...primul test este ca cel din exemplu shi ala imi dadea bine shi de asta...
Gata am rezolvat ms mult de help Smile
Memorat
notpennysboat
Strain


Karma: 0
Deconectat Deconectat

Mesaje: 1



Vezi Profilul
« Răspunde #109 : Martie 13, 2011, 11:35:32 »

am si eu o intrebare
Cod:
#include <cstdio>
#include <list>
#include <set>

using namespace std;

int n,m;
int d[50002],inms[50002];

struct Compar{
bool operator()(int i,int j){
return d[i]<d[j];
}
};

list<pair<int,int> > l[50002];
list<pair<int,int> >::iterator it;
multiset<int ,Compar> ms;

void citire(){
scanf("%d %d",&n,&m);
int i,x,y,c;
for(i=1;i<=m;i++){
scanf("%d %d %d" , &x,&y,&c);
l[x].push_back(make_pair(y,c));
}
}

void dijkstra(int rad){
int i,poz;
for(i=1;i<=n;i++){
d[i]=1000000000;
inms[i]=0;
}
inms[rad]=1;
d[rad]=0;
ms.insert(rad);
while(!ms.empty()){
poz=*ms.begin();
ms.erase(ms.begin());
inms[poz]=0;
for(it=l[poz].begin();it!=l[poz].end();++it)
if(d[(*it).first]>d[poz]+(*it).second){
if(inms[(*it).first]==1){
ms.erase((*it).first);
}
else {
inms[(*it).first]=1;
}
d[(*it).first]=d[poz]+(*it).second;
ms.insert((*it).first);

}
}
}

void afisare(){
int i;
for(i=2;i<=n;i++)
if(d[i]!=1000000000)
printf("%d ",d[i]);
else printf("0 ");
printf("\n");
}

int main(){
freopen("dijkstra.in","r",stdin);
freopen("dijkstra.out","w",stdout);
citire();
dijkstra(1);
afisare();
return 0;
}

am luat testele si unele dimensiuni imi dau prea mari ... nu reusesc sa gasesc greseala
Memorat
b_polar
Strain


Karma: 0
Deconectat Deconectat

Mesaje: 4



Vezi Profilul
« Răspunde #110 : Martie 21, 2011, 23:45:35 »

Salut!
De ieri tot încerc să fac un cod de 100 de puncte la această problemă, dar la fiecare implementare primesc TLE pe ultimul test. Am încercat mai multe variante:

Dijkstra cu heap - varianta fara STL
Dijkstra cu heap - varianta cu STL
Bellman-Ford cu coada - putin STL
Bellman-Ford cu coada - mai mult STL
Dijkstra cu coada de prioritati

Am pus aici toate variantele, însă mi-ar fi suficient dacă m-aţi putea ajuta să corectez măcar una dintre ele. Merci anticipat Smile.
« Ultima modificare: Martie 21, 2011, 23:52:24 de către Agape Mihai » Memorat
pykh
Strain


Karma: 0
Deconectat Deconectat

Mesaje: 3



Vezi Profilul
« Răspunde #111 : Martie 29, 2011, 20:03:13 »

Daca luati 80-90 cu TLE pe ultimele teste incercati sa faceti citirea cu streamuri. Asta a facut diferenta in cazul meu de la 80 la 100.
Memorat
jupanubv92
Client obisnuit
**

Karma: 19
Deconectat Deconectat

Mesaje: 74



Vezi Profilul
« Răspunde #112 : Martie 31, 2011, 21:01:46 »

Salut!
De ieri tot încerc să fac un cod de 100 de puncte la această problemă, dar la fiecare implementare primesc TLE pe ultimul test. Am încercat mai multe variante:

Dijkstra cu heap - varianta fara STL
Dijkstra cu heap - varianta cu STL
Bellman-Ford cu coada - putin STL
Bellman-Ford cu coada - mai mult STL
Dijkstra cu coada de prioritati

Am pus aici toate variantele, însă mi-ar fi suficient dacă m-aţi putea ajuta să corectez măcar una dintre ele. Merci anticipat Smile.

Si eu m-am chinuit ca tine, am bagat mai multe variante, dar vad ca au micşorat limita de timp. Sursa mea de 100 de anu trecut, ia 80 anul asta  Whistle . Cred ca trebuie facut cu zice Alexandru sa citesti cu streamuri sau sa parsezi citirea.
Memorat
PlayLikeNeverB4
Nu mai tace
*****

Karma: 212
Deconectat Deconectat

Mesaje: 721



Vezi Profilul
« Răspunde #113 : Martie 31, 2011, 21:05:49 »

Eu n-am parsat citirea si nici n-am citit cu streamuri si iau 100. Ce-i drept, iau ultimul test cu 500ms = limita Smile (da, stiu ca e doar un timp aproximativ)
Memorat
nicolaetitus12
Strain


Karma: 0
Deconectat Deconectat

Mesaje: 10



Vezi Profilul
« Răspunde #114 : Aprilie 08, 2011, 06:50:16 »

a reusit cineva sa faca dijkstra de 100 cu make_heap, push_heap si pop_heap?
Memorat
dushmi
Nu mai tace
*****

Karma: 130
Deconectat Deconectat

Mesaje: 472



Vezi Profilul
« Răspunde #115 : Aprilie 08, 2011, 07:08:45 »

a reusit cineva sa faca dijkstra de 100 cu make_heap, push_heap si pop_heap?

Eu am facut cu priority_queue si a intrat in timp. M-am uitat pe sursa ta... Incearca sa citesti cu fstream pentru ca merge mai bine pe infoarena uneori Smile
Memorat
nicolaetitus12
Strain


Karma: 0
Deconectat Deconectat

Mesaje: 10



Vezi Profilul
« Răspunde #116 : Aprilie 08, 2011, 16:57:52 »

Eu am facut cu priority_queue si a intrat in timp. M-am uitat pe sursa ta... Incearca sa citesti cu fstream pentru ca merge mai bine pe infoarena uneori Smile

Am optimizat toate maruntisurile si nu trece. La sursele mele prostia e ca vreau sa modific costul unui element din heap si sa-i mut pozitia in heap. Asta inseamna sa urmaresc pozitia tuturor elementelor in heap si sa folosesc cand trebuie sa le mut pozitia.
La sursa ta vad ca pur si simplu adaugi acelas nod dar cu alt cost. Daca are distanta mica atunci ajunge in varful heapului, daca nu, se pierde si nu ajunge sa-l procesezi vreodata. O sa incerc make_heap cu idea ta sa vad ce iese.
Multumesc!
Memorat
andunhill
Vorbaret
****

Karma: 12
Deconectat Deconectat

Mesaje: 183



Vezi Profilul
« Răspunde #117 : Aprilie 26, 2011, 12:26:34 »

S-a micsorat limita de timp? Sursa http://infoarena.ro/job_detail/357124?action=view-source lui Andrei Misarca  acum ia numai 90 de puncte http://infoarena.ro/job_detail/584692?action=view-source  Think. A mai reusit cineva sa ia 100 cu priority_queue recent? Eu nu reusesc sa scot mai mult decat 50, restul TLE  Brick wall.
Puteti sa va puteti uita peste sursa http://infoarena.ro/job_detail/584658?action=view-source si eventual sa imi spuneti ce sa mai optimizez ?
Multumesc anticipat.

LE: Am descoperit ce nu mergea. Nu inteleg dc trebuie  In loc de < sa pun > pentru a-mi tine elementele sortate crescator.
« Ultima modificare: Aprilie 26, 2011, 19:49:55 de către Macarescu Sebastian » Memorat
a_h1926
Echipa infoarena
Nu mai tace
*****

Karma: 317
Deconectat Deconectat

Mesaje: 385



Vezi Profilul
« Răspunde #118 : Iunie 06, 2011, 16:51:47 »

Am o problema cu algoritmul lui dijkstra folosind heap-urile... Am implementat exact cum este explicat algoritmul, dar iau doar 90 de puncte (pe ultimul test iau TLE), se poate uita cineva peste ultima sursa pe care am trimis-o si sa imi spuna ce am putut gresi sau ce pot eficientiza? Multumesc anticipat.

Link-ul pentru sursa este urmatorul:
http://infoarena.ro/job_detail/594225?action=view-source
« Ultima modificare: Iunie 06, 2011, 18:25:36 de către Heidelbacher Andrei » Memorat
Oancea.Catalin
Client obisnuit
**

Karma: -3
Deconectat Deconectat

Mesaje: 75



Vezi Profilul
« Răspunde #119 : Iunie 06, 2011, 19:24:47 »

incearca sa modifici citirea... in rest pare ok
Memorat
a_h1926
Echipa infoarena
Nu mai tace
*****

Karma: 317
Deconectat Deconectat

Mesaje: 385



Vezi Profilul
« Răspunde #120 : Iunie 06, 2011, 20:01:32 »

Am incercat sa fac cu citirile din C, dar asa iau 80 de puncte  Brick wall
Daca ai vrut sa spui altceva in legatura cu citirea, te rog fii putin mai explicit. Multumesc.
Memorat
Magnus
Client obisnuit
**

Karma: 0
Deconectat Deconectat

Mesaje: 57



Vezi Profilul
« Răspunde #121 : Iunie 06, 2011, 20:34:07 »

in loc de *2 pune <<1 si in loc de /2 pune >>1
astea sunt operatii pe biti si reprezinta shiftarea numarului la stanga sau la dreapta
l.e.:
trebuia sa verific daca ce spun are efecte majore.
ceea ce am spus mai sus nu te ajuta aici, dar cine stie.
ideea este sa-ti faci un struct edge{int dest,cost};
si in loc de
Cod:
vector <long> G[50005];
vector <long> C[50005];
sa ai
Cod:
vector <edge> G[50005];

ti-am modificat sursa si ia acum 100:
http://infoarena.ro/job_detail/594291 Cool
« Ultima modificare: Iulie 15, 2011, 09:35:56 de către Daniel Anghel » Memorat
MciprianM
Nu mai tace
*****

Karma: 87
Deconectat Deconectat

Mesaje: 324



Vezi Profilul
« Răspunde #122 : Iulie 15, 2011, 09:31:49 »

Merge de 100 de puncte si un algoritm in O(V*sqrt(V)+E) - sursa.
Memorat
soriyn
Vorbaret
****

Karma: 24
Deconectat Deconectat

Mesaje: 150



Vezi Profilul
« Răspunde #123 : Iulie 19, 2011, 20:30:22 »

Cod:
 graf *t = a[pmin];

        while ( t )
        {
            if ( d[ t->nod ] > d[pmin] + t->cost )
                d[ t->nod ] = d[pmin] + t->cost;

            t = t->next;
        }
imi poate explica si mie cineva,linie cu linie, bucata asta de cod din sursa de 40 ?  Confused

Foloseste tag-ul [ code ] [ /code ] cand postezi cod!
« Ultima modificare: Iulie 20, 2011, 00:51:13 de către FMI - Paul-Dan Baltescu » Memorat
PlayLikeNeverB4
Nu mai tace
*****

Karma: 212
Deconectat Deconectat

Mesaje: 721



Vezi Profilul
« Răspunde #124 : Iulie 19, 2011, 20:44:05 »

Cod:
graf *t = a[pmin];  // declaram un pointer caruia ii atribuim adresa listei cu vecinii nodului pmin (care e cel mai apropiat nod dintre cei nevizitati)

        while ( t ) // cat timp n-am ajuns la capatul listei
        {
            if ( d[ t->nod ] > d[pmin] + t->cost )  // daca drumul catre vecinul curent care trece prin pmin este unul mai scurt decat cel calculat pana acum
                d[ t->nod ] = d[pmin] + t->cost;   //  atribuim noua distanta

            t = t->next; // trecem la urmatorul vecin al lui pmin
        }
« Ultima modificare: Iulie 20, 2011, 00:50:36 de către FMI - Paul-Dan Baltescu » Memorat
Pagini: 1 ... 3 4 [5] 6 7 8   În sus
  Imprimă  
 
Schimbă forumul:  

Powered by SMF 1.1.19 | SMF © 2006-2013, Simple Machines