锰锌求解,为什么memset赋初值能AC,但是for循环会出锅
查看原帖
锰锌求解,为什么memset赋初值能AC,但是for循环会出锅
401987
yscc楼主2022/10/5 14:25
#include<bits/stdc++.h>
using namespace std;
const int maxn=7e6+8;
int n,p,k,tot,s,t;
int Head[maxn],dis[maxn];
priority_queue<pair<int,int>> q;
struct add_Edge
{
  int next,to,dis;
}Edge[maxn];
inline void add(int x,int y,int z)
{
  Edge[++tot].next=Head[x];
  Edge[tot].dis=z;
  Edge[tot].to=y;
  Head[x]=tot;
}
inline void dijkstra()
{
  memset(dis,0x3f,sizeof(dis));
  dis[s]=0;
  q.push({0,s});
  while(!q.empty())
    {
      int u1=q.top().first;
      int u2=q.top().second;
      q.pop();
      if(u1+dis[u2])continue;
      for(int i=Head[u2];i;i=Edge[i].next)
	if(dis[Edge[i].to]>dis[u2]+Edge[i].dis)
	  {
	    dis[Edge[i].to]=dis[u2]+Edge[i].dis;
	    q.push({-dis[Edge[i].to],Edge[i].to});
	  }
    }
}
inline unsigned long long read()
{
  unsigned long long x=0,f=1;
  char ch=getchar();
  while(ch<'0'||ch>'9')
    {
      if(ch=='-')
        f=-1;
      ch=getchar();
    }
  while(ch>='0'&&ch<='9')
    {
      x=x*10+ch-'0';  
      ch=getchar();
    }
  return x*f;
}
signed main()
{
  n=read(),p=read(),k=read();
  s=read(),t=read();
  for(int i=1;i<=p;i++)
    {
      int a,b,l;
      a=read(),b=read(),l=read();
      add(a,b,l);
      add(b,a,l);
      for(int j=1;j<=k;++j)
	{
	  add(a+j*n,b+j*n,l);
	  add(b+j*n,a+j*n,l);
	  add(a+(j-1)*n,b+j*n,0);
	  add(b+(j-1)*n,a+j*n,0);
	}
    }
  dijkstra();
  int ans=0x3f3f3f3f;
   for(int i=0;i<=k;i++)
    ans=min(ans,dis[i*n+t]);
    cout<<ans<<endl;
  return 0;
}
2022/10/5 14:25
加载中...