问题
宿舍有N个房间,每个房间住一个员工。为了方便给每个员工从1到N进行编号。有一天决定在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;
}