Afişează mesaje
|
Pagini: [1]
|
3
|
infoarena - concursuri, probleme, evaluator, articole / Arhiva de probleme / Răspuns: 199 Graf
|
: Decembrie 29, 2014, 14:40:35
|
imi poate spune ce e gresit in problema??? Deci prima oara fac parcurgerea in latime de la nodul X la nodul Y. Dupa care merg de la nodul Y si pentru fiecare vecin cu costul minim( , unde L[now] repr lungimea minima de la nodul X pana la nodul curect si L[p->vecin] lungimea de la nodul X pana la vecinul nodului curent(now) si pt fiecare vecin care indeplineste conditiile astea maresc aparitia nodului curent in lant si nr cu 1(nr reprezinta numarul de lanturi optime)). La sfarsit egalez numarul de aparitii al nodului X si Y cu nr si fac maximul din vectorul de aparitii si afisez toate nodurile egale cu acel maxim. P.S. : de ce la testul al doilea sunt doua drumuri intre 1 si 3 cand ar trb sa fie doar unul??? #include <iostream> #include <fstream> using namespace std; ifstream fin("graf.in"); ofstream fout("graf.out"); const int NMAX=100005,MMAX=1000005,inf=2000000; int N,M,S,L[MMAX],now,poz[NMAX],ap[NMAX],nr,Y; class coada { public: struct ncoada { int val; ncoada* next; }*primul,*ultimul; coada(int a) { primul=new ncoada; primul->val=a; ultimul=primul; primul->next=NULL;
} void push(int a) { if(primul) { ncoada *p=new ncoada; ultimul->next=p; p->val=a; ultimul=p; ultimul->next=NULL; } else { primul=new ncoada; primul->val=a; ultimul=primul; primul->next=NULL; }
} int pop(int a) { ncoada *p=primul; primul=primul->next; delete p; return a; } int empty() { if(primul) return 0; else return 1; } }; struct graf{ int vecin; graf* urm; }*v[NMAX]; void add(int nod, int vecin) { graf * p=new graf; p->urm=v[nod]; p->vecin=vecin; v[nod]=p; p=new graf; p->urm=v[vecin]; p->vecin=nod; v[vecin]=p; } void citire() { int x,y; fin>>N>>M>>S>>Y; while(M--) { fin>>x>>y; add(x,y); } } void parcurgere() { coada coad(S); now=S; do { now=coad.primul->val; graf* p=v[coad.pop(now)]; while(p) { if(poz[p->vecin]==0) { coad.push(p->vecin); if(L[p->vecin]>L[now]+1) L[p->vecin]=L[now]+1; poz[p->vecin]=1; } p=p->urm; } }while(!coad.empty()); } void parcurgere_inapoi() { coada coadb(Y); now=Y; nr=0; int n=0; graf *p=v[coadb.pop(now)]; while(p) { if(L[now]==L[p->vecin]+1) { nr++; ap[now]++; coadb.push(p->vecin); } p=p->urm; } n=-1; do { now=coadb.primul->val; graf *p=v[coadb.pop(now)]; while(p) { if(L[now]==L[p->vecin]+1) { n++; if(ap[now]) ap[now]++; else { coadb.push(p->vecin); ap[now]++; } } p=p->urm; } if(n>0) nr=nr+n; n=-1; }while(!coadb.empty()); } void afisare() { int max=0; ap[Y]=ap[S]=nr; for(int j=1;j<=N;++j) if(max<ap[j]) max=ap[j]; fout<<max<<"\n"; for(int j=1;j<=N;++j) if(max==ap[j]) fout<<j<<" "; }
int main() { citire(); for(int j=1;j<=N;++j) if(j!=S) L[j]=inf; parcurgere(); parcurgere_inapoi(); afisare();
return 0; }
|
|
|
5
|
infoarena - concursuri, probleme, evaluator, articole / Informatica / template specialization
|
: Decembrie 16, 2014, 13:36:55
|
de ce imi da eroarea urmatoare: "prototype for CVector<char> CVector<char>::uppercase()" does not match any in class Cvector<char> candidate is: CVector<char> CVector<char>::uppercase()" class CVector <char> { char x,y; public: CVector() {}; CVector(char a,char b) {x=a;y=b;}
CVector operator++() {x=x+1;y=y+1; return *this;}; CVector uppercase(); void afisare () const{cout<<" x="<<x<<" y="<<y<<"\n";} }; template <char> CVector<char> CVector<char>::uppercase() {...}
|
|
|
7
|
infoarena - concursuri, probleme, evaluator, articole / Informatica / clase
|
: Decembrie 13, 2014, 12:30:57
|
de ce imi afiseaza valorile in ordinea inversa a obiectelor apelate?? adica eu ma asteptat sa imi afiseze ceva de genul width=2 height=4 width=6 height=8 width=1 height=2 width=2 height=1 Asta se intampla doar daca apelez din cout, daca nu imi afiseaza in ordinea lor normala. imi poate spune cineva de ce se intampla asta?? P.S: Scuze, dar nu stiu cum sa atasez tip code asa ca pentru cei care nu vor sa download-eze un fisier am copiat aici programul..
#include <iostream>
using namespace std; int i; class Rectangle { int width,height; public: Rectangle (int a,int b) { width=a; height=b; } Rectangle () { int x,y; cout<<" width= ";cin>>x; cout<<" height= ";cin>>y; cout<<"\n"; width=x; height=y; } Rectangle (int x) {width=x; height=1;} int area() { cout<<" width= "<<width; cout<<" height= "<<height; cout<<" i= "<<++i; cout<<" \n"; return width*height; } void set_values(int x,int y) {width=2*x; height=2*y;} void set_values1() {set_values(width,height);} }rect,rectb;
int main() {
rectb.set_values1(); rect.set_values1(); Rectangle rectd(2),rectc(1,2); cout<<rect.area()<<" "<<rectb.area()<<" "<<rectc.area()<<" "<<rectd.area(); return 0; }
|
|
|
13
|
infoarena - concursuri, probleme, evaluator, articole / Articole / Răspuns: 000 Algoritmul lui Euclid
|
: Iulie 26, 2014, 11:28:45
|
nu inteleg cum ajunge programul sa rezolve ecuatiile "*x = y0; *y = x0 - (a / b) * y0;" , avand in vedere ca "euclid(b, a % b, d, &x0, &y0);" apeleaza functia inainte ca programul sa rezolve cele 2 ecuatii. Nu pot sa explic mai bine.. Daca nu ai inteles ce vreau... poti sa-mi explici cum "ruleaza" programul pas cu pas? ce face fiecare instructiune in parte?
|
|
|
14
|
infoarena - concursuri, probleme, evaluator, articole / Articole / Răspuns: 000 Algoritmul lui Euclid
|
: Iulie 26, 2014, 08:16:36
|
aha, merci. poti sa-mi spui te rog de ce atunci cand ajungi la apelul lui euclid , de ce programul calculeaza si *x = y0; *y = x0 - (a / b) * y0;. nu ar trebui sa apeleze din nou functia pana cand b==0, nemaitrecand la cele doua ecuatii care sunt dupa apel? euclid(b, a % b, d, &x0, &y0); *x = y0; *y = x0 - (a / b) * y0;
|
|
|
|