链接:登录—专业IT笔试面试备考平台_牛客网
来源:牛客网
题目描述
这一天,xmy去黑职找cr,xmy从哈东站下车后发现他的缺德地图开始缺德了。
因为缺德地图炸了,所以xmy翻出了plan B。
xmy拿出了一张地图。地图上有M段路。
每段路连接着两个路口。
并且标记出了两个路口的编号A和B,长度L(单位米)。还有一个标记W(标记是1为单向边 标记是2为双向边)。
xmy每秒可以走S米。
注:每个路口的编号是唯一的 编号相同的话 代表是同一个路口。
已知哈东站所在位置的编号为Xa,黑职所在的路口编号为Xb。
由于xmy太菜了,他想知道哈东站走路到黑职最快要多久,但是他不会算,就把数据发给了 hlj.king.cr。
cr看了一眼太简单了,把数据给了你,要你算好,然后发给xmy。
你只需要算好,最少需要多少秒可以从哈东站到达黑职就可以。如果出现小数向上取整。
如果不能从哈东站到达黑职,请输出-1。
输入描述:
第一行四个整数 M Xa Xb S
(1≤M≤2×105)(1\leq M \leq 2\times10^{5})(1≤M≤2×105) (1≤Xa,Xb≤1018)(1\leq Xa,Xb \leq 10^{18})(1≤Xa,Xb≤1018) (1≤S≤105)(1\leq S \leq 10^{5})(1≤S≤105)
以下M行,每行为四个整数 A B L W
(1≤A,B≤1018)(1\leq A,B \leq 10^{18})(1≤A,B≤1018) (1≤L≤105)(1\leq L \leq 10^{5})(1≤L≤105) (1≤W≤2)(1\leq W \leq {2})(1≤W≤2)
输出描述:
输出一个整数 需要多少秒(向上取整)
如果不能从哈东站到达黑职,请输出-1。
输入
6 1 3 2
1 2 2 1
2 3 2 1
2 4 1 1
1 3 5 1
3 4 3 1
1 4 4 1
输出
#include <bits/stdc++.h>
using namespace std;
long long n,m,cnt,xa,xb,s;
map<long long,long long>mp;
struct cmp{
bool operator()(pair<long long,long long>a, pair<long long,long long> b){
return a.first > b.first;
}
};
struct Edge{
long long to,w,next;
}edge[1000005];
long long head[1000005];
long long ans[1000005];
long long vis[1000005];
void init(){
cnt = 0;
for(long long i = 0 ; i < 1000005 ; i ++){
head[i] = -1;
vis[i] = 0;
ans[i] = 10000000000005;
}
}
void add(long long u, long long v, long long w){
edge[cnt].to = v;
edge[cnt].w = w;
edge[cnt].next = head[u];
head[u] = cnt ++;
}
void Dijkstra(int x){
priority_queue<pair<long long,long long>, vector<pair<long long,long long>>, cmp> q;
q.push({0,x});
ans[x] = 0;
while(!q.empty()){
pair<long long,long long> temp = q.top();
q.pop();
vis[temp.second] = 1;
for(long long i = head[temp.second] ; i != - 1 ; i = edge[i].next){
if (!vis[edge[i].to] && ans[edge[i].to] > ans[temp.second] + edge[i].w){
ans[edge[i].to] = ans[temp.second] + edge[i].w;
q.push({ans[edge[i].to], edge[i].to});
}
}
}
}
int main() {
cin >> n >> xa >> xb >> s;
init();
mp.clear();
cnt = 0;
mp[xa]=1;
mp[xb]=2;
long long u, v, w, u1,qw=3;
for (long long i = 0; i < n; i++) {
cin >> u >> u1 >> v >> w;
if(mp[u]==0){
mp[u]=qw++;
}
if(mp[u1]==0){
mp[u1]=qw++;
}
if(w==1){
add(mp[u],mp[u1],v);
}else{
add(mp[u], mp[u1], v);
add(mp[u1], mp[u], v);
}
}
if(xa==xb)
{
cout<<0<<endl;
return 0;
}
Dijkstra(1);
for(int i=1;i<=qw;i++){
cout<<ans[i]<<" ";
}
if(ans[mp[xb]]==10000000000005){
cout<<-1<<endl;
}else{
long long kk=ceil(ans[2]*1.0/s*1.0);
cout<<kk<<endl;
}
return 0;
}
2