hdu 最短路径的特殊运用

  1. #include <stdio.h>
  2. #define MAX 10000
  3. int path[MAX][MAX];
  4. bool sign[MAX][MAX];
  5. int ans;
  6. int n;
  7. int floyd()
  8. {
  9. for(int k=1; k<=n; k++)
  10. for(int i=1; i<=n; i++)
  11. for(int j=1; j<=n; j++)
  12. {
  13. if(i!=j && i!=k && k!=j) //自己与自己的边不存在
  14. {
  15. if(path[i][j] > path[i][k] + path[k][j]) //因为不可能再次出现最短路径所以一旦出现就是错误
  16. return -1;
  17. else if(path[i][j] == path[i][k] + path[k][j] && !sign[i][j]) //还需要判断是否计算过
  18. {ans--; sign[i][j] = true;} //重边可以去掉一个
  19. }
  20. }
  21. }
  22. int main()
  23. {
  24. //freopen("read.txt", "r", stdin);
  25. int T;
  26. scanf("%d", &T);
  27. int co = 1;
  28. while(T--)
  29. {
  30. printf("Case %d: ", co++);
  31. scanf("%d", &n);
  32. for(int i=1; i<=n; i++)
  33. for(int j=1; j<=n; j++)
  34. {scanf("%d", &path[i][j]); sign[i][j] = false;}
  35. ans = n*(n-1); //每个点到其它顶点的最多的边数,因为是有向的
  36. if(floyd() == -1)
  37. printf("impossible ");
  38. else
  39. printf("%d ", ans);
  40. }
  41. return 0;
  42. }





附件列表

    原文地址:https://www.cnblogs.com/sober-reflection/p/e79e42884ffbe4d544b9fe3953432e3c.html