[2016-04-02][POJ][3268][Silver Cow Party]

  • 时间:2016-04-02 20:30:40 星期六

  • 题目编号:[2016-04-02][POJ][3268][Silver Cow Party]

  • 题目大意:给定一个有向图图,1~n牛到k牛出参加party,所有牛都走最快的路,问所有牛中往返,耗时最长为多少,

  • 分析:

    • 求从1 -> k的最短路和 k -> 1的最短路之和,
    • 从1跑一次Dijkstra,从k跑一次Dijkstra,求和,
      • 在discuss发现有个叫矩阵转置的东西,即k->x的最短路,相当于把所有边反转之后,x -> k的最短路
  1. #include <queue>
  2. #include <algorithm>
  3. #include <cstring>
  4. #include <cstdio>
  5. using namespace std;
  6. const int maxn = 1000 + 10;
  7. struct Node{
  8. int v,c;
  9. Node(int _v = 0,int _c = 0):v(_v),c(_c){}
  10. bool operator < (const Node & a)const {
  11. return c > a.c;
  12. }
  13. };
  14. int vis[maxn],d1[maxn],d2[maxn],a[maxn][maxn],n,m,x;
  15. void Dijkstra(int d[],int s){
  16. priority_queue< Node > q;
  17. memset(vis,0,sizeof(vis));
  18. memset(d,0x3f,sizeof(int) * (n + 1));
  19. d[s] = 0;
  20. q.push(Node(s,0));
  21. Node tmp;
  22. while(!q.empty()){
  23. tmp = q.top();q.pop();
  24. int u = tmp.v;
  25. if(vis[u]) continue;
  26. vis[u] = 1;
  27. for(int i = 1;i <= n ; ++i){
  28. if(!vis[i]&& a[u][i] && d[i] > d[u] + a[u][i]){
  29. d[i] = d[u] + a[u][i];
  30. q.push(Node(i,d[i]));
  31. }
  32. }
  33. }
  34. }
  35. void trans(){
  36. for(int i = 1;i <= n ;++i)
  37. for(int j = i + 1;j <= n ; ++j)
  38. swap(a[i][j],a[j][i]);
  39. }
  40. int main(){
  41. int cntcase = 0,_a,b,c;
  42. int t;
  43. scanf("%d%d%d",&n,&m,&x);
  44. memset(a,0,sizeof(a));
  45. for(int i = 0;i < m ; ++i){
  46. scanf("%d%d%d",&_a,&b,&c);
  47. a[_a][b] = c;
  48. }
  49. Dijkstra(d1,x);
  50. trans();
  51. Dijkstra(d2,x);
  52. int ans = 0;
  53. for(int i = 1;i <= n ; ++i){
  54. ans = max(ans,d2[i]+d1[i]);
  55. }
  56. printf("%d\n\n",ans);
  57. return 0;
  58. }


来自为知笔记(Wiz)


posted on 2016-04-02 21:03  红洋  阅读(122)  评论(0)    收藏  举报

导航