# PBinfo #1652 – RF – Rezolvare C++

Sursa: Codul lui Andrei
Limbaj: C++
Autor rezolvare: andrei

## Enunț

Cerința
Se dă un graf orientat în care arcele au asociate costuri (numere naturale nenule). Să se determine câte arce (x,y) din graf au costul egal cu costul drumului de cost minim de la x la y.

Date de intrare
Programul citește de la tastatură numerele n m, reprezentând numărul de vârfuri și numărul de arce din graf, apoi m triplete i j p, reprezentând arcele, date prin extremități și cost.

Date de ieșire
Programul va afișa pe ecran numărul C, reprezentând valoare cerută.

Restricții și precizări

1 ≤ n ≤ 100
costurile arcelor vor fi mai mici decât 1000

Exemplu:
Intrare

5 7
2 1 10
2 3 2
3 1 10
3 4 3
3 5 1
4 1 2
5 4 1
Ieșire

4
Explicație
Cele  4 arce sunt: (2 3), (3 5), (4 1) și (5 4).

## Cod sursă C++

```cpp
#include <iostream>
#define INF 0x3f3f3f3f
using namespace std;
void Citire(int & n , int A[][105])
{
    int m;
    cin >> n >> m;
    for(int i = 1; i <= n ; i ++)
        for(int j = 1 ; j <= n ; j ++)
            if(i == j)
                A[i][j] = 0;
            else
                A[i][j] = INF;
    while(m > 0)
    {
        int i , j , p;
        cin >> i >> j >> p;
        A[i][j] = p;
        m --;
    }
}
void RF(int n , int A[][105])
{
    for(int k = 1 ; k <= n ; k ++)
        for(int i = 1 ; i <= n ; i ++)
            for(int j = 1 ; j <= n ; j ++)
                if(A[i][j] > A[i][k] + A[k][j])
                    A[i][j] = A[i][k] + A[k][j];
}
void  AfisMat(int n , int A[][105])
{
    for(int i = 1 ; i <= n ; i ++)
    {
        for(int j = 1 ; j <= n ; j ++)
            cerr << A[i][j] << " ";
        cerr << endl;
    }
    cerr << endl;
}
int main()
{
    int A[105][105], B[105][105], n;
    Citire(n , A);
    for(int i = 1; i <= n ; i ++)
        for(int j = 1 ; j <= n ; j ++)
            B[i][j] = A[i][j];
    RF(n , B);
    //AfisMat(n, A);
    //AfisMat(n, B);
    int cnt = 0;
    for(int i = 1; i <= n ; i ++)
        for(int j = 1 ; j <= n ; j ++)
            if(A[i][j] == B[i][j] && A[i][j] > 0 && A[i][j] < INF)
            {
                cnt ++;
                //cerr << i << " " << j << endl;
            }
    cout << cnt;
    return 0;
}
```

## Resurse

- [Pagina originală](https://codulluiandrei.ro/rezolvari/pbinfo/1652)
- [Sursa C++](https://codulluiandrei.ro/rezolvari/pbinfo/1652/cod.cpp)
- [Sursa pe GitHub](https://raw.githubusercontent.com/codulluiandrei/pbinfo/main/pbinfo-1652/main.cpp)
- [Cursuri de informatică pentru BAC](https://codulluiandrei.ro/academia/info-curs/pachet-cpp/)
