QOJ.ac
QOJ
ID | 题目 | 提交者 | 结果 | 用时 | 内存 | 语言 | 文件大小 | 提交时间 | 测评时间 |
---|---|---|---|---|---|---|---|---|---|
#50920 | #4437. Link with Running | zzxzzx123 | RE | 0ms | 0kb | C++17 | 1.5kb | 2022-09-29 17:27:17 | 2022-09-29 17:27:18 |
Judging History
answer
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
#define pii pair<ll,ll>
const int N=3e5+50;
int h[N],e[N],ne[N],idx,vis[N];
ll w[N],val[N];
void add(int u,int v,ll c,ll d){
e[idx]=v,ne[idx]=h[u],w[idx]=c,val[idx]=d,h[u]=idx++;
}
struct node{
int u;
ll e,p;
bool operator<(const node& a)const {
if(e!=a.e){
return e>a.e;
}
//p大的在前面
return p<a.p;
}
};
int n,m;
pii ans[N];
pair<long long ,long long> dij()
{
priority_queue<node>q;
q.push({1,0,0});
while(!q.empty()){
auto a=q.top();
int u=a.u,ee=a.e,p=a.p;
q.pop();
if(vis[u]) continue;
vis[u]=1;
if(u==n){
return {ee,p};
}
for(int i=h[u];~i;i=ne[i]){
int v=e[i];
if(vis[v]) continue;
if(ans[v].first<ee+w[i])
{
ans[v]={ee+w[i],p+val[i]};
q.push({v,ans[v].first,ans[v].second});
continue;
}
if(ans[v].first==(ee+w[i]))
{
if(ans[v].second<p+val[i]){
ans[v].second=p+val[i];
q.push({v,ans[v].first,ans[v].second});
continue;
}
}
}
}
}
int main(){
int t;
scanf("%d",&t);
while(t--){
memset(h,-1,sizeof h);
memset(vis,0,sizeof vis);
memset(ans,0,sizeof ans);
idx=0;
scanf("%d%d",&n,&m);
for(int i=1;i<=m;i++)
{
int u,v;
ll e,p;//如果是没有的点的话提前进行结束
scanf("%d%d%lld%lld",&u,&v,&e,&p);
add(u,v,e,p);
}//先选择补丢弃环
auto ans=dij();
printf("%lld %lld\n",ans.first,ans.second);
}
return 0;
}
详细
Test #1:
score: 0
Dangerous Syscalls
input:
12 100000 200000 1 2 838279516 902819511 1 3 293478832 513256010 2 4 682688353 204481674 2 5 360092507 651108247 5 6 519851939 323803002 6 7 675439277 205804465 7 8 419167205 386168059 6 9 140767493 382483305 9 10 558115401 613738466 9 11 902235661 744659643 9 12 851394758 1720015 12 13 635355827 46...