【題意】:一個有向圖,給出每兩點之間的最短路,問原圖至少有多少條邊?

【題解】:做一次floyd,記錄哪些邊可以由其他邊來代替,那么這些邊都是可以去掉的。

【代碼】:
 1 #include "iostream"
 2 #include "cstdio"
 3 #include "cstring"
 4 using namespace std;
 5 #define maxn 105
 6 int maz[maxn][maxn], maz1[maxn][maxn];
 7 bool visit[maxn][maxn];
 8 int n;
 9 
10 int solve() {
11     int cnt = 0;
12     memset(visit, falsesizeof(visit));
13     for(int k = 0; k < n; k++)
14         for(int i = 0; i < n; i++)
15             if(i != k)
16                 for(int j = 0; j < n; j++)
17                     if(j != k) {
18                         if(maz[i][j] == maz[i][k] + maz[k][j] && !visit[i][j]) cnt++, visit[i][j] = true;
19                         if(maz[i][j] > maz[i][k] + maz[k][j]) return -1;
20                     }
21     return n * (n - 1- cnt;
22 }
23 
24 int main() {
25     int T, tt = 1;
26     scanf("%d"&T);
27     while(T--) {
28         scanf("%d"&n);
29         for(int i = 0; i < n; i++)
30             for(int j = 0; j < n; j++)
31                 scanf("%d"&maz[i][j]);
32         int ans = solve();
33         printf("Case %d: ", tt++);
34         if(ans == -1) printf("impossible\n");
35         else printf("%d\n", ans);
36     }
37     return 0;
38 }