题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6290
Dijstra+堆优化基本操作:https://blog.csdn.net/CSDNjiangshan/article/details/79345031
官方题解:
主要参考博客:https://blog.csdn.net/lzc504603913/article/details/80524386
贴上代码:
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int Maxm=2e5+500;
const int Maxn=1e5+500;
inline void read(int &t){
char c;
t=0;
while((c=getchar())<'0'||c>'9');
while(c>='0'&&c<='9'){
t=t*10+(c-'0'),
c=getchar();
}
}
struct edge{
int u,v,a,b,next;
}e[Maxm];
int cnt,head[Maxn];
void add_edge(int u,int v,int a,int b){
e[cnt].u=u;
e[cnt].v=v;
e[cnt].a=a;
e[cnt].b=b;
e[cnt].next=head[u];
head[u]=cnt++;
}
struct Node{
int id;
ll d;
Node(int id,ll d):id(id),d(d){}
bool operator <(const Node &A)const{
return d>A.d;
}
};
ll d[Maxn];
bool vis[Maxn];
int dijstra(int S,int E){
memset(d,0x3f,sizeof(d));
memset(vis,0,sizeof(vis));
priority_queue <Node> que;
que.push(Node (S,1));
d[S]=1;
while(!que.empty()){
Node tp1=que.top();
que.pop();
int tp=tp1.id;
if(tp==E){
for(int i=1;;i++){
if((1LL<<i)>tp1.d){
return i-1;
}
}
}
if(vis[tp])
continue;
vis[tp]=1;
for(int i=head[tp];i!=-1;i=e[i].next){
if(vis[e[i].v])
continue;
if(((e[i].a+tp1.d)/tp1.d)>=(1LL<<e[i].b)&&e[i].a+tp1.d<d[e[i].v]){
d[e[i].v]=e[i].a+tp1.d;
que.push(Node(e[i].v,d[e[i].v]));
}
}
}
return -1;
}
int main()
{
int T;
read(T);
while(T--){
memset(head,-1,sizeof(head));
cnt=0;
int u,v,a,b,N,M;
read(N),read(M);
for(int i=0;i<M;i++){
read(u),read(v),read(a),read(b);
add_edge(u,v,a,b);
}
printf("%d\n",dijstra(1,N));
}
return 0;
}