摘要

题目链接 难度等级 完成状态 完成分数 最后编辑时间 需要注意
多源最短路 ★☆☆☆☆ 答案正确 100 2015-7-20 19:47:39

代码

1077.cpp代码已折叠
展开折叠内容
显示/移除行号
  1. #include<cstdio>
  2. #include<algorithm>
  3. #include<iostream>
  4. #include<set>
  5. #include<queue>
  6. #include<cstring>
  7. #include<climits>
  8. #include<cmath>
  9. using namespace std;
  10. #define lld long long
  11. queue<int> p;
  12. vector< pair<int,int> > L[256]={};
  13. int Dis[256][256]={};
  14. #define foreach(i,a) for(typeof(a.begin()) i=a.begin();i!=a.end();++i)
  15. int main(){
  16. int n;
  17. scanf("%d",&n);
  18. memset(Dis,15,sizeof(Dis));//设置初值为很大的值//
  19. int Ans=INT_MAX;int Ansc;
  20. for(int i=1;i<=n;++i)
  21. {
  22. for(int j=1;j<=n;++j)
  23. {
  24. //新建路径//
  25. int d;
  26. scanf("%d",&d);
  27. L[i].push_back( make_pair(j,d) );
  28. }
  29. }
  30.  
  31. //伦家就是喜欢SPFA口亨,100个点肯定也不会出问题//
  32. for(int r=1;r<=n;++r)
  33. {
  34. p.push(r);Dis[r][r]=0;
  35. while(!p.empty())//队列非空//
  36. {
  37. foreach(i,L[p.front()])//遍历//
  38. {
  39. if(Dis[r][p.front()]+i->second<Dis[r][i->first])//判断Dis是否更优//
  40. {
  41. Dis[r][i->first]=Dis[r][p.front()]+i->second;//更新目标点并入队//
  42. p.push(i->first);
  43. if(isupper(i->first))//统计Ans//
  44. {
  45. if(Dis[r][i->first]<Ans)
  46. {
  47. Ans=Dis[r][i->first];
  48. Ansc=i->first;
  49. }
  50. }
  51. }
  52. }
  53. p.pop();
  54. }
  55. }
  56. //由于查询可能很多,先计算后处理查询//
  57. int Q;
  58. scanf("%d",&Q);
  59. for(int i=1;i<=Q;++i)
  60. {
  61. int x,y;
  62. scanf("%d%d",&x,&y);
  63. printf("%d\n",Dis[x][y]);
  64. }
  65. }
  66.  

著作权声明[编辑]

关于[编辑]