spfa
查看原帖
spfa
147401
koishi_offical楼主2021/10/30 16:55

这道题是不给spfa活路吗( T了最后一个点

using namespace std;
const int N=5e4+10,M=2e5+10;
int n,m,p,s,t;
int h[N],e[M],ne[M],w[M],idx;
void add(int a,int b,int c)
  {
      e[++idx]=b;
      ne[idx]=h[a];
      h[a]=idx;
      w[idx]=c;
  }
long long dist[N][60];
pair<int,int> pre[N][60];
bool v[N][60];
queue<pair<int,int> > q;
void print(int x,int y)
  {
      if(!x) return;
      print(pre[x][y].first,pre[x][y].second);
      cout<<x<<"->";
  }
inline int read(){
    int 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<<1)+(x<<3)+(ch^48);
        ch=getchar();
    }
    return x*f;
}
int main() {
    n=read(),m=read(),p=read(),s=read(),t=read();
    for(int i=1;i<=m;i++)
      {
          int x,y,z;
          x=read(),y=read(),z=read();
          add(x,y,z);
      }
    memset(dist,0x7f,sizeof(dist));
    dist[s][0]=0;
    q.push({s,0});
    while(!q.empty())
      {
          int x=q.front().first,y=q.front().second;
          q.pop();
          v[x][y]=0;
          for(int i=h[x];i;i=ne[i])
          if(dist[x][y]+w[i]<dist[e[i]][(y+w[i])%p])
            {
                pre[e[i]][(y+w[i])%p]={x,y};
                dist[e[i]][(y+w[i])%p]=dist[x][y]+w[i];
                if(!v[e[i]][(y+w[i])%p]) q.push({e[i],(y+w[i])%p});
                v[e[i]][(y+w[i])%p]=1;
            }
      }
     if(dist[t][0]<0x3f3f3f3f)
       {
           cout<<dist[t][0]<<endl;
           print(pre[t][0].first,pre[t][0].second);
           cout<<t;
       }
     else
       {
           cout<<"jjc fails in travelling";
       }
}
2021/10/30 16:55
加载中...