hdu 4034 Graph(floyd)

题意:给定原图顶点间的最短路,问原图最少有几条边。

分析:若两点的距离可由另外两条边来代替,则可删去该边;若存在比这两点的距离更短的路径,则“impossible”.

View Code
 1 /*

 2 Author:Zhaofa Fang

 3 Lang:C++

 4 */

 5 #include <cstdio>

 6 #include <cstdlib>

 7 #include <iostream>

 8 #include <cmath>

 9 #include <cstring>

10 #include <algorithm>

11 #include <string>

12 #include <utility>

13 #include <vector>

14 #include <queue>

15 #include <stack>

16 #include <map>

17 #include <set>

18 using namespace std;

19 typedef long long ll;

20 #define pii pair<int,int>

21 #define pb push_back

22 #define mp make_pair

23 #define fi first

24 #define se second

25 #define lowbit(x) (x&(-x))

26 const int INF = 2147483647;

27 

28 int maz[105][105];

29 int floyd(int n)

30 {

31     int cnt = 0;

32     for(int k=0;k<n;k++)

33     {

34         for(int i=0;i<n;i++)

35         {

36             for(int j=0;j<n;j++)

37             {

38                 if(i == k || j == k || i == k)continue;

39                 if(maz[i][k] == -1 || maz[k][j] == -1 || maz[i][j] == -1)continue;

40                 if(maz[i][j] > maz[i][k] + maz[k][j])return -1;

41                 if(maz[i][j] == maz[i][k] + maz[k][j])

42                 {

43                     cnt++;maz[i][j]=-1;

44                 }

45             }

46         }

47     }

48     return n*(n-1) - cnt ;

49 }

50 int main()

51 {

52     #ifndef ONLINE_JUDGE

53     freopen("in","r",stdin);

54     #endif

55     int T,cas=0;

56     scanf("%d",&T);

57     while(T--)

58     {

59         int n;

60         scanf("%d",&n);

61         memset(maz,0,sizeof(maz));

62         for(int i=0;i<n;i++)

63             for(int j=0;j<n;j++)

64                 scanf("%d",&maz[i][j]);

65         int tmp = floyd(n);

66         printf("Case %d: ",++cas);

67         if(tmp != -1)printf("%d\n",tmp);

68         else puts("impossible");

69     }

70     return 0;

71 }

你可能感兴趣的:(floyd)