【題目敘述】https://tioj.ck.tp.edu.tw/problems/1212
【解題想法】Floyd-Warshall shortest path
#include <iostream>
#include <cstring>
using namespace std;
int n, m, dis[505][505], a, b;
int main() {
while (cin >> n >> m){
if (n == 0) break;
memset(dis, 0x3F, sizeof(dis));
for (int i = 0; i < m; i++){
cin >> a >> b;
dis[a][b] = 1;
}
for (int k = 1; k <= n; k++){
for (int i = 1; i <= n; i++){
for (int j = 1; j <= n; j++){
if (dis[i][k]+dis[k][j] < dis[i][j]) dis[i][j] = dis[i][k]+dis[k][j];
}
}
}
int mn = 1000;
for (int i = 1; i <= n; i++){
mn = min(mn, dis[i][i]);
}
if (mn == 1000) cout << 0 << "\n";
else cout << mn << "\n";
}
}