Călinuţa tocmai a găsit o foaie de hârtie pe care este desenat un graf orientat aciclic cu N noduri şi M arce, fiecare arc având o distanţă de valoare întreagă.
Cerință
Dându-se N, M şi cele M arce cu distanţele dintre ele, trebuie să calculaţi pentru Călinuţa distanţa minimă dintre fiecare două noduri.
Date de intrare
Fișierul de intrare graph.in conține pe prima linie numerele naturale N și M separate printr-un singur spațiu, iar pe următoarele M linii se află câte 3 numere A, B şi C, reprezentând un arc de la A către B de lungime C.
Date de ieșire
Fișierul de ieșire graph.out conține N linii cu câte N valori separate prin câte un spaţiu, reprezentând matricea drumurilor minime. Dacă nu există drum de la un nod a la un nod b, valoarea care trebuie afişată este x.
Restricții și precizări:
N <= 1500M <= 30 000- Numerele nodurilor sunt valori cuprinse între
1şiN - Lungimea arcelor aparţine intervalului
[-1000; 1000] - Pentru 25% din teste
N <= 150şiM <= 1000 - Pentru alte 40% din teste
N <= 1000
Exemplu
graph.in
8 9 1 2 7 2 3 -1 2 4 -2 2 7 3 8 2 -2 8 6 3 5 4 2 5 6 6 6 7 -5
graph.out
0 7 6 5 x x 10 x x 0 -1 -2 x x 3 x x x 0 x x x x x x x x 0 x x x x x x x 2 0 6 1 x x x x x x 0 -5 x x x x x x x 0 x x -2 -3 -4 x 3 -2 0
#include <bits/stdc++.h>
using namespace std;
ifstream cin("graph.in");
ofstream cout("graph.out");
vector<vector<pair<int, int>>> G(30001);
int n, m, x, y, c, a[1501][1501];
void lee(int nod){
int d[1501];
for(int i = 1; i <= n; ++i)
d[i] = 1000000001;
queue<int> Q;
Q.push(nod);
d[nod] = 0;
while(!Q.empty()){
int x = Q.front();
for(auto i:G[x]){
if(d[i.first] > d[x] + i.second)
d[i.first] = d[x] + i.second, Q.push(i.first);
}
Q.pop();
}
for(int i = 1; i <= n; ++i)
if(d[i] != 1000000001)
a[nod][i] = d[i];
else
a[nod][i] = -1000000000;
}
int main(){
cin >> n >> m;
for(int i = 1; i <= m; ++i){
cin >> x >> y >> c;
G[x].push_back(make_pair(y, c));
}
for(int i = 1; i <= n; ++i){
lee(i);
}
for(int i = 1; i <= n; ++i, cout << '\n')
for(int j = 1; j <= n; ++j)
if(a[i][j] != -1000000000)
cout << a[i][j] << ' ';
else cout << 'x' << ' ';
return 0;
}