Pagini: [1] 2   În jos
  Imprimă  
Ajutor Subiect: 564 Rfinv  (Citit de 8434 ori)
0 Utilizatori şi 1 Vizitator pe acest subiect.
DITzoneC
Nu mai tace
*****

Karma: 301
Deconectat Deconectat

Mesaje: 962



Vezi Profilul
« : Noiembrie 19, 2007, 00:07:40 »

Aici puteţi discuta despre problema Rfinv.
Memorat
Dastas
Vorbaret
****

Karma: 11
Deconectat Deconectat

Mesaje: 170



Vezi Profilul
« Răspunde #1 : Noiembrie 19, 2007, 21:58:13 »

Exista ceva cazuri particulare mai subtile? Am facut rezolvarea in O(n3) si iau incorect Raised eyebrow
Memorat
filipb
Nu mai tace
*****

Karma: 232
Deconectat Deconectat

Mesaje: 929



Vezi Profilul
« Răspunde #2 : Noiembrie 19, 2007, 22:00:02 »

Ai grija sa verifica ca daca pentru o pereche (i j) nu exista nici un k pentru care distanta de la i la k + distanta de la k la j sa fie egala cu distanta de la i la j si nu ai muchie de la i la j in graful initial, atunci trebuie sa afisezi ca nu exista solutie.
Memorat
Dastas
Vorbaret
****

Karma: 11
Deconectat Deconectat

Mesaje: 170



Vezi Profilul
« Răspunde #3 : Noiembrie 19, 2007, 22:25:09 »

Pai, in solutia oficiala spune:

Citat
Pe fiecare muchie a grafului (i,j) se pune o distanta egala cu valoarea A[j] (A fiind matricea data). Se aplica apoi algoritmul Roy-Floyd pe acest graf, iar matricea distantelor obtinuta trebuie sa fie identica cu matricea distantelor data (in caz contrar neexistand solutie).

Eu asa am facut. Am mai pus si verificarea zisa de tine, dar tot incorect iau..

N-ar trebui sa ajunga doar pasii din solutia oficiala?
Memorat
filipb
Nu mai tace
*****

Karma: 232
Deconectat Deconectat

Mesaje: 929



Vezi Profilul
« Răspunde #4 : Noiembrie 19, 2007, 22:38:27 »

Eu am facut un pic altfel ( de fapt e acelasi lucru cu solutia oficiala dar e formulat altfel ):

* pentru fiecare pereche (i j) trebuie sa am A[ i ][ j ] <= A[ i ][ k ] + A[ k ][ j ] pentru orice k. Daca exista un k pt. care A[ i ][ k ] + A[ k ][ j ] < A[ i ][ j ] => nu am solutie
* daca exista o pereche (i j) pt. care nu exista nici un k a. i. A[ i ][ j ] = A[ i ][ k ] + A[ k ][ j ] si nu am muchie de la i la j in graf => nu am solutie

Eu am facut asa si am obtinut 100 Smile.
« Ultima modificare: Noiembrie 19, 2007, 22:43:17 de către Filip Cristian Buruiana » Memorat
Dastas
Vorbaret
****

Karma: 11
Deconectat Deconectat

Mesaje: 170



Vezi Profilul
« Răspunde #5 : Noiembrie 19, 2007, 23:44:39 »

Mi-a iesit pana la urma, mersi!

Memorat
toni2007
Nu mai tace
*****

Karma: 160
Deconectat Deconectat

Mesaje: 663



Vezi Profilul
« Răspunde #6 : Martie 26, 2008, 22:53:48 »

solutia in n^4 nu intra in timp? (nici cea din articolul de solutii nu-mi intra)
Memorat
sigrid
De-al casei
***

Karma: 61
Deconectat Deconectat

Mesaje: 129



Vezi Profilul
« Răspunde #7 : Martie 27, 2008, 06:43:53 »

Intra un O(n^3) Smile. Ce faci tu in O(n^4)?
Memorat
toni2007
Nu mai tace
*****

Karma: 160
Deconectat Deconectat

Mesaje: 663



Vezi Profilul
« Răspunde #8 : Martie 27, 2008, 11:49:28 »

fac exact ca in articolul de solutii
Citat
Vom sorta toate cele O(N2) distante din matrice in ordine crescatoare si vom initializa o matrice D[j]=infinit, pentru i <> j, respectiv 0, pentru i=j. Pe masura ce parcurgem sirul sortat al distantelor, vom actualiza valorile din matricea D. Sa presupunem ca am ajuns la o distanta avand valoarea x, ce reprezinta distanta minima dintre 2 noduri i si j. Daca D[j] < x sau D[j] > x si nu exista muchie in graf intre i si j, atunci nu avem solutie si ne oprim. Daca D[j] > x si exista muchie intre i si j, atunci vom pune pe aceasta muchie costul x. In continuare, va trebui sa actualizam valorile D[a] afectate de setarea valorii x pe muchia (i,j). Mai exact, pentru fiecare pereche de noduri (a,b), D[a] va fi egal cu minimul dintre valoarea actuala D[a] si min { D[a] + x + D[j], D[a][j] + x + D }.

Daca nu am intalnit nici o contradictie pe masura ce am parcurs muchiile, atunci raspunsul este "DA" ; in caz contrar, raspunsul este "NU".

am schimbat sortarea din qsort in sort din stl si acum merge in timp da imi da incorect...

puteti si voi sa puneti un test mai lung? ca nu ma prind Brick wall
Memorat
fireatmyself
Nu mai tace
*****

Karma: 36
Deconectat Deconectat

Mesaje: 492



Vezi Profilul
« Răspunde #9 : Martie 27, 2008, 13:38:44 »

Cod:
3
5 8
1 2
1 3
1 5
2 3
2 4
3 4
3 5
4 5
0 9 67 71 41
98 0 165 169 139
67 165 0 4 26
71 169 4 0 30
41 139 26 30 0
6 8
1 4
1 5
2 3
2 4
3 4
3 5
4 6
5 6
0 39 9 80 6 82
39 0 30 101 33 109
9 30 0 71 3 79
80 101 71 0 74 60
6 33 3 74 0 76
82 109 79 60 76 0
7 16
1 2
1 4
2 4
2 5
2 6
2 7
3 4
3 5
3 6
3 7
4 5
4 6
4 7
5 6
5 7
6 7
0 28 57 56 52 62 72
28 0 31 32 24 34 44
57 31 0 1 7 17 27
56 32 1 0 8 18 28
52 24 7 8 0 10 20
62 34 17 18 10 0 10
72 44 27 28 20 10 0

raspunsurile sunt NU, DA, respectiv DA.
Memorat

Viata e scurta. Daca nu o putem lungi, macar s-o facem lata.
sigrid
De-al casei
***

Karma: 61
Deconectat Deconectat

Mesaje: 129



Vezi Profilul
« Răspunde #10 : Martie 27, 2008, 14:56:22 »

Eu aveam o problema la rfinv pentru ca nu initializam matricea inainte de fiecare test si ramaneau in ea valori din testele anterioare. Vezi sa nu gresesti si tu asta  wink
Memorat
toni2007
Nu mai tace
*****

Karma: 160
Deconectat Deconectat

Mesaje: 663



Vezi Profilul
« Răspunde #11 : Martie 27, 2008, 22:51:49 »

mie imi da NU NU NU... tre sa mai lucrez la ea  Brick wall si aia cu reinitializarea o aveam la inceput si nu imi mergea nici testu din enunt parca... dupaia am modificat si mi-a mers deci nu-i problema de la aia... da ciudat e ca am doua rezolvari (una in N^3 si una in N^4) care iau 0 puncte

LE: Cu cealalta sursa imi da NU DA DA dar iau 0 puncte Neutral


Cod:

for (k=0;k<nr;++k){
        xx=x[k];
        //printf("%d %d %d\n",x[k].val,x[k].i,x[k].j);
if (d[ii[xx]][jj[xx]]>val[xx] && y[ii[xx]][jj[xx]]!=1 || d[ii[xx]][jj[xx]]<val[xx] && y[ii[xx]][jj[xx]]!=1){
           printf("NU\n");
           return;
        }
        if (d[ii[xx]][jj[xx]]>val[xx] && y[ii[xx]][jj[xx]]==1){
           d[ii[xx]][jj[xx]]=val[xx];
           for (a=0;a<n;++a)
               for (b=0;b<n;++b)
                      d[a][b]=min(d[a][b],min(d[a][ii[xx]] + val[xx] + d[jj[xx]][b], d[a][jj[xx]] + val[xx] + d[ii[xx]][b]));
        }
    }
    printf("DA\n");

asa fac... x este vectorul sortat iar d este matricea cu distantele. in val retin valoarea initiala in ii linia pe care se afla si in jj coloana
« Ultima modificare: Martie 27, 2008, 23:14:35 de către Pripoae Teodor Anton » Memorat
fireatmyself
Nu mai tace
*****

Karma: 36
Deconectat Deconectat

Mesaje: 492



Vezi Profilul
« Răspunde #12 : Martie 28, 2008, 11:23:53 »

in principiu asa fac si eu. ai sortat perechile (i,j) din matricea initiala, crescator, dupa valoare?
Memorat

Viata e scurta. Daca nu o putem lungi, macar s-o facem lata.
toni2007
Nu mai tace
*****

Karma: 160
Deconectat Deconectat

Mesaje: 663



Vezi Profilul
« Răspunde #13 : Martie 28, 2008, 11:47:03 »

da... nu stiu sigur daca am implementat sort din stl bine (eu lucrez in c) da cu qsort nu intra in timp... cu asta intra dar imi da incorect
Memorat
fireatmyself
Nu mai tace
*****

Karma: 36
Deconectat Deconectat

Mesaje: 492



Vezi Profilul
« Răspunde #14 : Martie 28, 2008, 12:29:53 »

nu stiu ce sa zic. trimite-mi sursa ca pm.
Memorat

Viata e scurta. Daca nu o putem lungi, macar s-o facem lata.
S7012MY
Nu mai tace
*****

Karma: 26
Deconectat Deconectat

Mesaje: 648



Vezi Profilul
« Răspunde #15 : Iunie 19, 2010, 15:46:49 »

Ma poate ajuta cineva sa-mi spuna ce gresesc aici :
Cod:
#include <cstdio>
template <class T>
class pereche {
public:
int prim,ultim;

};

void rezolva() {
    pereche <int> muchii[2500];
    int i,j,k;
    int init[51][51],rez[51][51],n,m;
    scanf("%d %d",&n ,&m );
    ///<citire muchii>
    for(i=1; i<=m; i++)
        scanf("%d %d",&muchii[i].prim,&muchii[i].ultim);
    ///</citire muchii>
    for(i=1; i<=n; i++) for(j=1; j<=n; j++) scanf("%d",&rez[i][j]);//citire matr initiala
    for(i=1; i<=m; i++) {
        init[muchii[i].prim][muchii[i].ultim] = rez[muchii[i].prim][muchii[i].ultim];
        init[muchii[i].ultim][muchii[i].prim] = rez[muchii[i].prim][muchii[i].ultim];
    }
    ///<royfloyd>
    for (k = 1; k <= n; k++)
for (i = 1; i <= n; i++)
for (j = 1; j <= n; j++)
if (init[i][k] && init[k][j] &&
(init[i][j] > init[i][k] + init[k][j] || !init[i][j]) &&
i != j)
                    init[i][j] = init[i][k] + init[k][j];
    ///</royfloyd>
    for(i=1; i<=n; i++) for(j=1; j<=n; j++)
        if(init[i][j]!=rez[i][j]) {
            printf("NU\n"); return;
        }
    printf("DA\n");

}

int main()
{
    int t,i;
    freopen("rfinv.in","r",stdin);
    freopen("rfinv.out","w",stdout);
    scanf("%d",&t);
    for(i=0; i<t; i++)
       rezolva();
    return 0;
}



Memorat
mathboy
Moderatori infoarena
Nu mai tace
*****

Karma: 150
Deconectat Deconectat

Mesaje: 259



Vezi Profilul
« Răspunde #16 : Iunie 19, 2010, 20:44:42 »

Initializeaza unde nu ai muchii in matricea init cu o valoare destul de mare (100000000), iar atunci cand faci roy-floyd fa asa :
Cod:
if (i != j && i != k && j != k)
           init[i][j] = min (init[i][j], init[i][k] + init[k][j])
Ar trebui sa mearga asa Very Happy
« Ultima modificare: Iunie 19, 2010, 20:50:24 de către Dragos-Alin Rotaru » Memorat
S7012MY
Nu mai tace
*****

Karma: 26
Deconectat Deconectat

Mesaje: 648



Vezi Profilul
« Răspunde #17 : Iunie 19, 2010, 21:35:42 »

Nu merge  Brick wall
Memorat
mathboy
Moderatori infoarena
Nu mai tace
*****

Karma: 150
Deconectat Deconectat

Mesaje: 259



Vezi Profilul
« Răspunde #18 : Iunie 19, 2010, 21:36:38 »

La initializare ai grija cand i == j sa pui init [ i ] [ j ] = 0 ?
« Ultima modificare: Iunie 19, 2010, 21:48:31 de către Dragos-Alin Rotaru » Memorat
diehard
Strain


Karma: 0
Deconectat Deconectat

Mesaje: 1



Vezi Profilul
« Răspunde #19 : Februarie 13, 2012, 10:47:16 »

Eu am rezolvat problema cu 2 foruri si 15 if-uri am luat maxim 100 de puncte.  Banana Banana Banana
Memorat
Eby7
Strain


Karma: 0
Deconectat Deconectat

Mesaje: 6



Vezi Profilul
« Răspunde #20 : Noiembrie 11, 2013, 11:48:57 »

Imi poate explica, va rog, cineva care este motivul pentru care nu primesc punctaj pe sursa asta?

Cod:
#include<fstream>
using namespace std;
ifstream f("rfinv.in");
ofstream g("rfinv.out");
int t;
int n,m;
int a[51][51];
int b[51][51];
int i,j;
int x,y;
int ok;
int r;
int main()
{
    f>>t;
    for(int k=1;k<=t;k++)
    {
        ok=0;
        f>>n>>m;
        for(i=1;i<=n;i++)
         for(j=1;j<=n;j++)
          a[i][j]=b[i][j]=0;
        for(i=1;i<=m;i++)
        {
            f>>x>>y;
            a[x][y]=a[y][x]=1;
        }
        for(i=1;i<=n;i++)
        {
            for(j=1;j<=n;j++)
            {
                f>>r;
                b[i][j]=r;
            }
        }
        for(i=1;i<=n;i++)
         for(j=1;j<=n;j++)
          if((a[i][j]==0&&b[i][j]>0)||(a[i][j]>0&&b[i][j]==0))
              ok=1;
        if(ok==0)
          g<<"DA"<<"\n";
        else
          g<<"NU"<<"\n";
    }
    return 0;
}
Memorat
TrascaAndrei
Strain


Karma: 1
Deconectat Deconectat

Mesaje: 18



Vezi Profilul
« Răspunde #21 : Ianuarie 06, 2016, 00:41:10 »

Daca se mai uita cineva la problema aceasta, am si eu nevoie de ajutor. Imi merge pe ambele exemple(si cel din enunt si cel de la "fireatmyself") dar iau 0 puncte. Am incercat si metoda lui Dastas, merge pe exemple, dar tot 0 puncte iau  Brick wall

Cod:
#include <iostream>
#include <stdio.h>
#define infile "rfinv.in"
#define outfile "rfinv.out"
#define N 51
#define inf 100001

using namespace std;

int c[N][N],n,m,t,a[N][N];

FILE * in=fopen(infile,"r");
FILE * out=fopen(outfile,"w");

void cit()
{
    fscanf(in,"%d %d\n",&n,&m);
    int i,j;
    for(i=1;i<=n;i++)
        for(j=i+1;j<=n;j++)
        {
            a[i][j]=a[j][i]=inf;
            c[i][j]=c[j][i]=inf;
        }
    for(i=1;i<=m;i++)
    {
        int x,y;
        fscanf(in,"%d %d",&x,&y);
        a[x][y]=a[y][x]=1;
    }
    for(i=1;i<=n;i++)
        for(j=1;j<=n;j++)
        {
            fscanf(in,"%d",&c[i][j]);
            if(a[i][j])
                a[i][j]=c[i][j];
        }
}

void roy_floyd()
{
    int i,j,k;
    for(k=1;k<=n;k++)
        for(i=1;i<=n;i++)
            for(j=1;j<=n;j++)
                if(i!=j && j!=k && i!=k)
                    a[i][j]=min(a[i][j],a[i][k]+a[k][j]);
}

bool sol2()
{
    int i,j,k,sw=0;
    for(i=1;i<=n;i++)
        for(j=1;j<=n;j++)
        {
            sw=0;
            for(k=1;k<=n;k++)
                {
                    if(c[i][j]>c[i][k]+c[k][j])
                        return 0;
                    if(c[i][j]==c[i][k]+c[k][j])
                        sw=1;
                }
            if(!sw && a[i][j]==inf)
                return 0;
        }
    return 1;
}

inline void verif()
{
    int i,j;
    for(i=1;i<=n;i++)
        for(j=1;j<=n;j++)
            if(a[i][j]!=c[i][j])
            {
                fprintf(out,"NU");
                return ;
            }
    fprintf(out,"DA");
}

int main()
{
    int i;
    fscanf(in,"%d\n",&t);
    for(i=1;i<=t;i++)
    {
        cit();
        roy_floyd();
        verif();
        /*if(sol2())
            fprintf(out,"DA");
        else
            fprintf(out,"NU");*/
        fprintf(out,"\n");
    }
    return 0;
}

Sol2 este solutia lui Dastas
Memorat
PlayLikeNeverB4
Nu mai tace
*****

Karma: 212
Deconectat Deconectat

Mesaje: 721



Vezi Profilul
« Răspunde #22 : Ianuarie 06, 2016, 12:38:31 »

Cod:
if(a[i][j])
Conditia nu e tot timpul adevarata?

Incearca sa eviti pe viitor conditii formulate dubios. In loc de "if (x)", pune explicit "if (x > 0)".
Memorat
TrascaAndrei
Strain


Karma: 1
Deconectat Deconectat

Mesaje: 18



Vezi Profilul
« Răspunde #23 : Ianuarie 06, 2016, 23:19:02 »

Salut! Multumesc de raspuns, nu imi dadusem seama ca initializasem matricea cu infinit. O sa incerc sa vad daca acum merge, dar observ ca sunt probleme la compilator momentan.
« Ultima modificare: Ianuarie 07, 2016, 23:30:51 de către Trasca Andrei » Memorat
TrascaAndrei
Strain


Karma: 1
Deconectat Deconectat

Mesaje: 18



Vezi Profilul
« Răspunde #24 : Ianuarie 12, 2016, 23:09:09 »

Cod:
if(a[i][j])
Conditia nu e tot timpul adevarata?

Incearca sa eviti pe viitor conditii formulate dubios. In loc de "if (x)", pune explicit "if (x > 0)".

Se pare ca tot 0 puncte iau, chiar si cu aceasta modificare. Nu pot sa imi dau seama care este problema
Memorat
Pagini: [1] 2   În sus
  Imprimă  
 
Schimbă forumul:  

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