题解:
模板题,地界特斯拉+堆优化
注意第一种建边
代码:
#include<bits/stdc++.h> using namespace std; typedef long long ll; const int N=1e6+5,M=1e7+5; ll dis[N]; int a1,b1,c3,a,b,c,a2,b2,a3,b3,T,n,m,num,l; int fi[N],zz[M],sl[M],ne[M],f[N],q[N],p; void jb(int x,int y,int z) { ne[++num]=fi[x]; fi[x]=num; zz[num]=y; sl[num]=z; } void up(int x) { if (x==1)return; if (dis[f[x]]<dis[f[x/2]]) { swap(f[x],f[x/2]); swap(q[f[x]],q[f[x/2]]); up(x/2); } } void down(int x) { int i=x; if (x*2<=l&&dis[f[i]]>dis[f[x*2]])i=x*2; if (x*2<l&&dis[f[i]]>dis[f[x*2+1]])i=x*2+1; if (i!=x) { swap(f[x],f[i]); swap(q[f[x]],q[f[i]]); down(i); } } int main() { scanf("%d%d",&n,&m); scanf("%d%d%d%d%d%d",&T,&a1,&a2,&b1,&b2,&p); m-=T; while (T--) { a=(ll)((ll)a*a1+a2)%p; b=(ll)((ll)b*b1+b2)%p; a3=min(a%n+1,b%n+1); b3=max(a%n+1,b%n+1); c3=1e8-a3; jb(a3,b3,c3); } while (m--) { scanf("%d%d%d",&a3,&b3,&c3); jb(a3,b3,c3); } memset(dis,0x3f3f3f3f,sizeof dis); dis[1]=0; for (int i=1;i<=n;i++)f[i]=q[i]=i; l=n; for (int i=1;i<=n;i++) { int k=f[1]; if (k==n)break; q[f[l]]=1; f[1]=f[l--]; down(1); for (int j=fi[k];j;j=ne[j]) if (dis[zz[j]]>dis[k]+sl[j]) { dis[zz[j]]=dis[k]+sl[j]; up(q[zz[j]]); } } printf("%lld",dis[n]); }