•Bogdan_tmm
|
 |
« 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
Mesaje: 14
|
 |
« 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 ? #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
|
 |
« 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 
|
|
|
•maoo
Strain
Karma: 0
Deconectat
Mesaje: 4
|
 |
« 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 #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
|
 |
« 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  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
Mesaje: 4
|
 |
« 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 
|
|
|
Memorat
|
|
|
|
•gabitzish1
|
 |
« Răspunde #106 : Februarie 01, 2011, 10:49:12 » |
|
Sa inteleg ca pe testul asta : 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 si iei 0 puncte pe primul test?
|
|
|
Memorat
|
|
|
|
•PlayLikeNeverB4
|
 |
« 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 
|
|
|
Memorat
|
|
|
|
•maoo
Strain
Karma: 0
Deconectat
Mesaje: 4
|
 |
« 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 
|
|
|
Memorat
|
|
|
|
•notpennysboat
Strain
Karma: 0
Deconectat
Mesaje: 1
|
 |
« Răspunde #109 : Martie 13, 2011, 11:35:32 » |
|
am si eu o intrebare #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
|
|
|
|
|
•pykh
Strain
Karma: 0
Deconectat
Mesaje: 3
|
 |
« 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
Mesaje: 74
|
 |
« Răspunde #112 : Martie 31, 2011, 21:01:46 » |
|
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  . Cred ca trebuie facut cu zice Alexandru sa citesti cu streamuri sau sa parsezi citirea.
|
|
|
Memorat
|
|
|
|
•PlayLikeNeverB4
|
 |
« 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  (da, stiu ca e doar un timp aproximativ)
|
|
|
Memorat
|
|
|
|
•nicolaetitus12
Strain
Karma: 0
Deconectat
Mesaje: 10
|
 |
« 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
|
 |
« 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 
|
|
|
Memorat
|
|
|
|
•nicolaetitus12
Strain
Karma: 0
Deconectat
Mesaje: 10
|
 |
« 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  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
|
|
|
|
|
•a_h1926
|
 |
« 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
Mesaje: 75
|
 |
« Răspunde #119 : Iunie 06, 2011, 19:24:47 » |
|
incearca sa modifici citirea... in rest pare ok
|
|
|
Memorat
|
|
|
|
•a_h1926
|
 |
« Răspunde #120 : Iunie 06, 2011, 20:01:32 » |
|
Am incercat sa fac cu citirile din C, dar asa iau 80 de puncte  Daca ai vrut sa spui altceva in legatura cu citirea, te rog fii putin mai explicit. Multumesc.
|
|
|
Memorat
|
|
|
|
•Magnus
Client obisnuit

Karma: 0
Deconectat
Mesaje: 57
|
 |
« 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 vector <long> G[50005]; vector <long> C[50005]; sa ai ti-am modificat sursa si ia acum 100: http://infoarena.ro/job_detail/594291 
|
|
« Ultima modificare: Iulie 15, 2011, 09:35:56 de către Daniel Anghel »
|
Memorat
|
|
|
|
•MciprianM
|
 |
« 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
|
 |
« Răspunde #123 : Iulie 19, 2011, 20:30:22 » |
|
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 ? 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
|
 |
« Răspunde #124 : Iulie 19, 2011, 20:44:05 » |
|
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
|
|
|
|
|