2 条题解

  • 0
    @ 2025-10-8 16:55:30

    题目:求1到n的次短路径

    #include <bits/stdc++.h>
    using namespace std;
    const int N=5100, M=2e5+10;
    struct edge{int x, y, c, pre;}a[M];
    int alen, last[N];
    void ins(int x, int y, int c){
        alen++;
        a[alen]={x, y, c, last[x]};
        last[x]=alen;
    }
    int read()
    {
        int x=0, f=1;
        char ch=getchar();
        for(;!isdigit(ch);ch=getchar()){if(ch=='-')f=-1;}
        for(;isdigit(ch);ch=getchar()) x=x*10+ch-48;
        return x*f;
    }
    int n, m, d1[N], d2[N], v[N];
    void spfa()
    {
        queue<int> q;
        q.push(1);
        memset(d1, 0x0f, sizeof(d1));
        d1[1]=0;
        memset(d2, 0x0f, sizeof(d2));
        memset(v, 0, sizeof(v));
        v[1]=1;
        
        while(!q.empty()){
            int x=q.front();
            q.pop();
            v[x]=0;
            for(int k=last[x];k;k=a[k].pre){
                int y=a[k].y, c=a[k].c;
                if(d1[y] > d1[x] + c){
                    d2[y] = d1[y];
                    d1[y] = d1[x] + c;
                    if(v[y]==0) q.push(y), v[y]=1;
                }
                if(d2[y] > d1[x] + c && d1[y] < d1[x] + c){
                    d2[y] = d1[x] + c;
                    if(v[y]==0) q.push(y), v[y]=1;
                }
                if(d2[y] > d2[x] + c){
                    d2[y] = d2[x] + c;
                    if(v[y]==0) q.push(y), v[y]=1;
                }
            }
        }   
    }
    int main()
    {
        n=read();
        m=read();
        alen=0;
        memset(last, 0, sizeof(last));
        for(int i=1, x, y, c; i<=m; i++){
            x=read();
            y=read();
            c=read();
            ins(x, y, c);
            ins(y, x, c);
        }
        spfa();
        printf("%d\n", d2[n]);
        return 0;
    }
    
    • 0
      @ 2025-10-8 16:55:07
      #include<bits/stdc++.h>
      using namespace std;
      const int N=5100,M=2e5+10;
      struct edge{int x,y,c,pre;}a[M];int alen,last[N];
      void ins(int x,int y,int c){alen++;a[alen]={x,y,c,last[x]};last[x]=alen;}
      int read()
      {
      	int x=0,f=1;char ch=getchar();
      	for(;!isdigit(ch);ch=getchar()){if(ch=='-')f=-1;}
      	for(;isdigit(ch);ch=getchar()) x=x*10+ch-48;
      	return x*f;
      }
      int n,m,d1[N],d2[N],v[N];
      void spfa()
      {
          queue<int> q;q.push(1);
          memset(d1,0x0f,sizeof(d1));d1[1]=0;
          memset(d2,0x0f,sizeof(d2));
          memset(v,0,sizeof(v));v[1]=1;
          
          while(!q.empty())
      	{
              int x=q.front();q.pop();v[x]=0;
              for(int k=last[x];k;k=a[k].pre)
      		{
                  int y=a[k].y,c=a[k].c;
                  if(d1[y]>d1[x]+c)
      			{
                      d2[y]=d1[y];
      				d1[y]=d1[x]+c;
                      if(v[y]==0)q.push(y),v[y]=1;
                  }
                  if(d2[y]>d1[x]+c && d1[y]<d1[x]+c )
                  {
                  	d2[y]=d1[x]+c;
                  	if(v[y]==0)q.push(y),v[y]=1;
                  }
                  if(d2[y]>d2[x]+c )
                  {
                  	d2[y]=d2[x]+c;
                  	if(v[y]==0)q.push(y),v[y]=1;
                  }
              }
          }   
      }
      int main()
      {
          n=read();m=read();
          alen=0;memset(last,0,sizeof(last));
          for(int i=1,x,y,c;i<=m;i++)
      	{
              x=read();y=read();c=read();
              ins(x,y,c);ins(y,x,c);
          }
          spfa();
          printf("%d\n",d2[n]);
          return 0;
      }
      • 1

      *【最短路】次短路[USACO06NOV] Roadblocks G

      信息

      ID
      1064
      时间
      1000ms
      内存
      512MiB
      难度
      7
      标签
      递交数
      14
      已通过
      11
      上传者