• POJ 3268


    求从原点到达某个点之后返回,来回最长的距离是多少? 比较基础的问题,两遍Dijkstra就可以了。

       1:   
       2:  #include <iostream> 
       3:  #include <vector>
       4:  #include <algorithm>
       5:  #include <queue>
       6:  #include <string.h>
       7:  #include <stdio.h>
       8:  using namespace std;
       9:   
      10:  #define V   1005
      11:  #define E   100005
      12:  #define INF 329999         
      13:   
      14:  // v :the end point of an edge. w : the weight of the weight next:cluster according to the begin point of the edge
      15:  struct node
      16:  {
      17:      int v, w,next;
      18:      node(int vv=0, int ww=0):v(vv),w(ww){}
      19:      bool operator < (const node& r) const{return w> r.w;}
      20:  }pnt[E],pnt1[E];
      21:   
      22:  int e=0,N,M,s;
      23:   
      24:  int head[V];
      25:  int dis[V];
      26:  bool vis[V];
      27:  int src, sink;
      28:   
      29:  void Dijkstra()
      30:  { 
      31:      priority_queue<node> Q; 
      32:      vis[src] = 1; dis[src] = 0; 
      33:      Q.push(node(src, 0)); 
      34:      for (int u = src, i=1; i< N; i++)                 
      35:      { 
      36:          for (int j = head[u]; j != -1; j = pnt[j].next)    // j is edge number.
      37:          { 
      38:              int v = pnt[j].v;                          
      39:              if (vis[v] == 0 && dis[v] > dis[u] + pnt[j].w )// pre is the current vertex
      40:              { 
      41:                  dis[v] = dis[u] + pnt[j].w; 
      42:                  Q.push(node(v, dis[v]));
      43:              } 
      44:          } 
      45:          while (!Q.empty() && vis[Q.top().v]) Q.pop(); 
      46:          if (Q.empty()) break;
      47:          vis[u = Q.top().v] = 1; Q.pop();
      48:      }
      49:  } 
      50:  int head1[V];
      51:  inline void addedge1(int u, int v, int w)
      52:  {
      53:      pnt1[s].v =v; pnt1[s].w = w; pnt1[s].next = head1[u]; head1[u]=s++;
      54:  }
      55:  inline void addedge(int u, int v, int w){ 
      56:      pnt[e].v = v; pnt[e].w = w; pnt[e].next= head[u]; head[u]=e++;
      57:  } 
      58:   
      59:  void Dijkstra_init()
      60:  { 
      61:      e = 0; s =0;
      62:      memset(head, -1, sizeof(head)); 
      63:      memset(head1, -1, sizeof(head));
      64:      memset(vis, 0, sizeof(vis));
      65:      scanf("%d%d", &N , &M);
      66:      for (int i = 0; i <=N; i++) dis[i] = INF; 
      67:      scanf("%d", &src);
      68:      //cout<<src<<endl;
      69:      for(int i=0; i<M; i++)
      70:      {
      71:          int a, b, c;
      72:          scanf("%d%d%d", &a, &b, &c);
      73:          addedge(a, b, c);
      74:          addedge1(b,a, c);
      75:      }
      76:   
      77:   
      78:  } 
      79:   
      80:  int main()
      81:  {
      82:      //freopen("3268.txt","r",stdin);
      83:   
      84:      Dijkstra_init();
      85:      Dijkstra();
      86:      int dis1[V];
      87:      for(int i=0; i<=N; i++) dis1[i] = dis[i];
      88:      //for(int i=1; i<=N; i++) cout<<dis[i]<<" "; cout<<endl;
      89:      memset(vis, 0 ,sizeof(vis));
      90:      for(int i=0; i<=N; i++) { dis[i]= INF; head[i] = head1[i];}
      91:      for(int i=0; i<M; i++)
      92:      {
      93:          pnt[i]=pnt1[i];
      94:   
      95:      }
      96:      Dijkstra();
      97:      //for(int i=1; i<=N; i++) cout<<dis[i]<<" "; cout<<endl;
      98:      int ret = 0;
      99:      for(int i=1; i<=N; i++) ret = max(ret, dis1[i]+dis[i]);
     100:      cout<<ret<<endl;
     101:      return 0;
     102:  }
     103:   
  • 相关阅读:
    漫谈施工企业信息化规划(修订)
    SOAOffice 中间件,北京科翰软件
    组建“建筑施工企业信息化技术交流”QQ群(102226121),欢迎参与!
    国产、免费业务流程梳理工具SAM,炎黄盈动公司产品
    (参考)OpenExpressApp架构-信息系统开发平台
    逍遥笔输入法,哈!
    昨天开了一天的会!!
    昨天回到北京了!
    幸福是什么?
    周末辽宁兴城
  • 原文地址:https://www.cnblogs.com/sosi/p/2763521.html
Copyright © 2020-2023  润新知