2 solutions

  • 2
    @ 2024-5-16 13:05:12

    #P3371. 【模板】单源最短路径(弱化版)题解) 的代码复制过来,然后改我注释标的地方就行了

    注意:有负边权,所以不能用 Dijkstra

    代码

    #include <bits/stdc++.h>
    using namespace std;
    const int N = 1505,M = 50005,INF = 0x80000000;	// 改这里
    
    // 链式前向星
    struct edge{
    	int u,v,w,prev;
    }edges[M];
    int tail[N],tot;
    void add_edge(int u,int v,int w){
    	edges[++tot] = {u,v,w,tail[u]};
    	tail[u] = tot;
    }
    
    int dis[N],n,m,s = 1;
    bool f[N];
    void bf(){
    	queue<int> q;
    	q.push(s);
    	while (!q.empty()){
    		int u = q.front();
    		q.pop();
    		f[u] = 0;
    		for (int j = tail[u];j;j = edges[j].prev){
    			int v = edges[j].v,w = edges[j].w;
    			if (dis[u] + w > dis[v]){	// 改这里
    				dis[v] = dis[u] + w;
    				if (!f[v])	q.push(v),f[v] = 1;
    			}
    		}
    	}
    }
    int main(int argc, char **argv){
    	fill(dis,dis + N,INF);
    	cin >> n >> m;
    	dis[s] = 0;
    	for (int i = 0;i < m;i++){
    		int u,v,w;
    		cin >> u >> v >> w;
    		add_edge(u,v,w);
    	}
    	bf();
    	cout << (dis[n] == INF?-1:dis[n]);	// 改这里
    	return 0;
    }
    
    • 0
      @ 2024-5-9 13:59:33

      题意

      求最长路

      思路

      spfa的代码的大小号反改

      正无穷改为负无穷就可以了

      代码

      #include<iostream>
      #include<cstring>
      #include<queue>
      #define N 314514
      #define INF 0x3fffffff
      using namespace std;
      int t,n,m;
      struct ed
      {
          int u,v,w;
          int next;
      };
      ed edge[N];
      int h[N],tot;
      void push(int u,int v,int w)
      {
          edge[++tot]={u,v,w,h[u]};
          h[u]=tot;
      }
      int dis[N];
      int vis[N];
      queue<int>q;
      void spfa()
      {
          dis[1]=0;
          q.push(1);
          while(!q.empty())
          {
              int u=q.front();
              q.pop();
              vis[u]=0;
              for(int j=h[u];j;j=edge[j].next)
              {
                  int v=edge[j].v;
                  int w=edge[j].w;
                  if(dis[v]<dis[u]+w)//改一下
                  {
                      dis[v]=dis[u]+w;
                      if(!vis[v])
                      {
                          q.push(v);
                          vis[v]=1;
                      }
                  }
              }
          }
      }
      int main()
      {
          fill(dis,dis+N,-INF);//负无穷
          cin>>n>>m;
          for(int i=1;i<=m;i++)
          {
              int u,v,w;
              cin>>u>>v>>w;
              push(u,v,w);
          }
          spfa();
          if(dis[n]==-INF)//特判
              cout<<-1;
          else
              cout<<dis[n];
          return 0;
      }
      
      • 1

      Information

      ID
      1083
      Time
      1000ms
      Memory
      128MiB
      Difficulty
      8
      Tags
      # Submissions
      52
      Accepted
      8
      Uploaded By