参加宴会



问题

宿舍有N个房间,每个房间住一个员工。为了方便给每个员工从1N进行编号。有一天决定在X号员工的房间开宴会,各个员工从各自的房间出发到X号员工的房间后,等宴会结束后再回自己的房间。此时,移动的路径要按照最短路径进行移动。但问题是连接各房间的M条路是单行道,因此到达那个房间的路径和从那个房间返回的路径只能不同。

 

给出各条路的信息时,我们来计算去参加宴会然后返回时所用时间最长的员工的所需时间。

输入

第一行给出员工数量N,路的数量M,举办宴会的员工的编号X (1 N 1,000, 1 M 100,000)

从第二行开始到第M行给出各条路的信息s,e,t.

s是单行道开始的房间编号,e是路尽头的房间编号,t是经过那条路所需的时间,所需时间在1以上100以下。

输出

在第一行输出参加宴会然后返回时所用时间最长的员工的所需时间

案例输入

4 8 2

1 2 4

1 3 2

1 4 7

2 1 1

2 3 5

3 1 2

3 4 4

4 2 3

案例输出

10

 


#include <stdio.h>

#include <vector>

#include <algorithm>

#include <queue>

 

using namespace std;

 

int N, M, X;

 

vector< pair<int, int> >edges[50003];

vector< pair<int, int> >rev_edges[50003];

 

 

vector<int> dijkstra(vector<pair<int, int> > edges[]) {

         priority_queue<pair<int,int> > Q;

 

         vector<int>table(N, 100000000);

         vector<bool>visit(N, false);

 

         table[X]= 0;

         Q.push(make_pair(0,X));

 

         while(!Q.empty()) {

                  pair<int,int> now = Q.top();

                  Q.pop();

 

                  if(visit[now.second]) {

                          continue;

                  }

                  visit[now.second]= true;

 

                  for(int i = 0; i < edges[now.second].size(); i++) {

                          intnext = edges[now.second][i].first;

                          intcost = edges[now.second][i].second;

 

                          if(table[next] > table[now.second] + cost) {

                                   table[next]= table[now.second] + cost;

                                   Q.push(make_pair(-table[next],next));

                          }

                  }

         }

         returntable;

}

 

int main() {

         scanf("%d%d %d", &N, &M, &X);

         X--;

 

         for(int i = 0; i < M; i++) {

                  ints, e, c;

                  scanf("%d%d %d", &s, &e, &c);

                  s--;

                  e--;

 

                  edges[s].push_back(make_pair(e,c));

                  rev_edges[e].push_back(make_pair(s,c));

         }

 

         vector<int>D1 = dijkstra(edges);

         vector<int>D2 = dijkstra(rev_edges);

 

         intret = 0;

         for(int i = 0; i < N; i++) {

                  if(ret < D1[i] + D2[i]) {

                          ret= D1[i] + D2[i];

                  }

 

                  edges[i].clear();

                  rev_edges[i].clear();

         }

         printf("%d\n",ret);

 

         return0;

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值