acm floyd 最短路径

  1. #include <stdio.h>
  2. #include <queue>
  3. #include <iostream>
  4. using namespace std;
  5. #define INF 0xfffff //因为为了辨别是否有负权,所以INF不能开太大
  6. #define MAX 1100
  7. int path[MAX][MAX];
  8. bool visit[MAX][MAX];
  9. int result;
  10. int floyd (int n) //边较为少而稀疏,能一次性求出所有的顶点到顶点的最短路径
  11. {
  12. int i, j, k;
  13. for (k = 1; k <= n; k++)
  14. for (i = 1; i <= n; i++)
  15. for (j = 1; j <= n; j++)
  16. {
  17. if(i!=j && j!=k && k!=i)
  18. {
  19. if (path[i][k] + path[k][j] < path[i][j])
  20. {
  21. return 0;
  22. }
  23. else if(path[i][k] + path[k][j] == path[i][j] && !visit[i][j])
  24. {
  25. result--;
  26. visit[i][j] = true;
  27. }
  28. }
  29. }
  30. }
  31. void input(int line)
  32. {
  33. int a, b, weight;
  34. for(int i=1; i<=line; i++)
  35. {
  36. for(int j=1; j<=line; j++)
  37. {
  38. scanf("%d", &weight);
  39. path[i][j] = weight;
  40. visit[i][j] = false;
  41. }
  42. }
  43. }
  44. int main()
  45. {
  46. //freopen("read.txt", "r", stdin);
  47. int T;
  48. scanf("%d", &T);
  49. int co = 1;
  50. while(T--)
  51. {
  52. int n;
  53. scanf("%d", &n);
  54. result = n*n -n;
  55. input(n);
  56. int tep = floyd(n);
  57. printf("Case %d: ", co++);
  58. if(tep == 0)
  59. printf("impossible\n");
  60. else
  61. {
  62. printf("%d\n", result);
  63. }
  64. }
  65. return 0;
  66. }





附件列表

     

    posted @ 2015-01-29 15:39  sober_reflection  阅读(153)  评论(0编辑  收藏  举报