ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

P9751 [CSP-J 2023] 旅游巴士

P9751 [CSP-J 2023] 旅游巴士 我代码的建图方法与其他所有题解不同在洛谷上居然能 AC。我直接用一维数组加链式前向星。直接以 t%k 的 0 到 k-1 的不同状态建图。我认为大部分人应该更能理解我的建图方法。如以上分层就如分层图的正常建法分为 k-1 个图将各边连接 0 层连 1 层k-1 层连 k 层。但是k%k0就连回 0 层最后用 Dijkstra 最短路算法求出结果。求各位大神点评#includebits/stdc.h using namespace std; struct qq{ int x,y,z; }a[5000005]; int n,m,k,st1,ed,ans[5000005]; int head[5000005],ver[5000005],deg[5000005],Next[5000005],tot; int v[5000005]; priority_queue pairint,int lmj; void add(int x,int y,int z){ ver[tot]y,Next[tot]head[x]; head[x]tot,deg[tot]z; } void dij(){ memset(ans,0x3f3f3f3f,sizeof(ans)); ans[st]0; lmj.push(make_pair(-0,st)); while(lmj.size()){ int qlmj.top().second; lmj.pop(); if(v[q]) continue; v[q]1; for(int jhead[q];j;jNext[j]){ int yver[j],zdeg[j]; if(zans[q]){ int cnt(z-ans[q])/k; if((z-ans[q])%k!0){ cnt; } ans[y]min(ans[y],ans[q]1cnt*k); } else{ ans[y]min(ans[y],ans[q]1); } lmj.push(make_pair(-ans[y],y)); } } } int main(){ cinnmk; for(int i1;im;i){ cina[i].xa[i].ya[i].z; add((k-1)*na[i].x,a[i].y,a[i].z); } for(int i1;ik;i){ for(int j1;jm;j){ add((i-1)*na[j].x,i*na[j].y,a[j].z); } } dij(); if(ans[n]1061109567){ cout-1; return 0; } coutans[n]; return 0; }
返回列表