zoukankan      html  css  js  c++  java
  • spfa模板

    /**
    spfa   判断有没有负权值的边;
    1.把源点放进队列;
    
      2.出队 
      用对头进行松弛操作 
      
        3松弛操作的点进队列;
        3如果 改点在队列里就不用进队列;
        
          
     2 .如果进队次数多于n;return ;
    
      
        
          
            */
    
    #include<iostream>
    #include<queue>
    using namespace std;
    const int maxn=1000+10;
    const int INF=0x3ffffff;
    int map[maxn][maxn];
    int used[maxn];//总进队列次数;
    bool qused[maxn];//队列里的元素;
    int dis[maxn];//用来更新最短数组;
    
    void init()
    {
        int i;
        int j;
        for(i=0;i<maxn;i++)
        {
            used[i]=0;
            qused[i]=0;
            dis[i]=INF;
            for(j=0;j<maxn;j++)
            {
                map[i][j]=INF;
                if(i==j)
                {
                    map[i][j]=0;
                
                }
            
            
            
            }
        
        
        
        }
    
    
    
    
    
    
    }
    
    int spfa(int num)
    {
        queue<int> q;
        //源点进入;
        dis[num]=0;
        q.push(num);
        used[num]++;
        qused[num]=1;
        while(!q.empty())
        {
            int now;
            int k;
            now=q.front();
            q.pop();
            qused[now]=0;
            for(k=1;k<maxn;k++)
            {
                if(used[k]>=maxn)
                {
                    return 0;
                
                }
                if(map[now][k]+dis[now]<dis[k])//松弛操作
                {
                    dis[k]=map[now][k]+dis[now];
                    if(!qused[k])//判断队列里面有没有 k这个点
                    {
                        used[k]++;
                        qused[k]=1;
                        q.push(k);
                    
                    }
                
                }
            
            }
        
        
        
        
        }
        
    return 1;
    }
    int main()
    {
        int n,m;
        while(scanf("%d %d",&n,&m)!=EOF,n+m)
        {
            init();
            int x;
            int y;
            int value;
            while(m--)
            {
                cin>>x>>y>>value;
                if(map[x][y]>value)
                {
                    map[x][y]=value;
                    map[y][x]=value;
                
                }
            
            }//输入完成;
            if(spfa(1))
            {
                printf("%d
    ",dis[n]);;
            
            
            }
            else 
            {
                printf("wrong
    ");
            }
    
        
        
        
        }
        
    
        
    
    
    
    
    
    
    
    return 0;
    }
  • 相关阅读:
    Kubernetes tutorial
    MySQL 安装示例数据库(employee、world、sakila、menagerie 等)
    Schema 与数据类型优化
    Linux 初始化系统 systemd
    Linux 初始化系统(init)- systemd
    Vagrant 手册之 Provisioning
    Vagrant 手册之 Provisioning
    Vagrant 手册之 Provisioning
    Vagrant 手册之 Vagrantfile
    Vagrant 手册之 Vagrantfile
  • 原文地址:https://www.cnblogs.com/2013lzm/p/3269892.html
Copyright © 2011-2022 走看看