bzoj3040

题解:

模板题,地界特斯拉+堆优化

注意第一种建边

代码:

#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]); 
} 
原文地址:https://www.cnblogs.com/xuanyiming/p/7718412.html