zoukankan      html  css  js  c++  java
  • 最短路径 | 1003 dfs 或 dij ,单源最短路径条数与经过的点权最大

    这题很早之前就遇到过,是pat留给我的第一印象,然而昨天却有点写不出来。今天dfs用了10分钟不到写出来了。dij用了大约15分钟,捉虫花了一点时间。

    dfs:

    注意剪枝的时候别剪错就行了。

    #include <stdio.h>
    #include <memory.h>
    #include <math.h>
    #include <string>
    #include <vector>
    #include <set>
    #include <stack>
    #include <queue>
    #include <algorithm>
    #include <map>
    
    
    #define I scanf
    #define OL puts
    #define O printf
    #define F(a,b,c) for(a=b;a<c;a++)
    #define FF(a,b) for(a=0;a<b;a++)
    #define FG(a,b) for(a=b-1;a>=0;a--)
    #define LEN 1010
    #define MAX (1<<30)+1
    #define V vector<int>
    
    using namespace std;
    
    int n,m,s,e; 
    int team_set[LEN];
    int g[LEN][LEN];
    int way_cnt=1;
    int best_cost=MAX;
    int best_team=0;
    int vis[LEN];
    
    void dfs(int v,int cost,int team){
        if(v==e){
            if(cost<best_cost){
                best_cost=cost;
                best_team=team;
                way_cnt=1;
            }else if(cost==best_cost){
                way_cnt++;
                if(team>best_team)
                    best_team=team;
            }
            return;
        }
        vis[v]=1;
        int i;                            //↓注意剪枝的判断语句,不要把≤写成< 
        FF(i,n) if(g[v][i] && !vis[i] && cost+g[v][i]<=best_cost){
            dfs(i,cost+g[v][i],team+team_set[i]);
        }
        vis[v]=0;
    }
     
    int main(){
    //    freopen("D:\CbWorkspace\PAT\最短路径\1003.txt","r",stdin);
        int a,b,c,i;
        I("%d%d%d%d",&n,&m,&s,&e);
        FF(i,n) I("%d",&team_set[i]);
        FF(i,m){
            I("%d%d%d",&a,&b,&c);
            g[a][b]=c;
            g[b][a]=c;
        }
        dfs(s,0,team_set[s]);
        printf("%d %d
    ",way_cnt,best_team);
        return 0;
    }

    dij:

    #include <stdio.h>
    #include <memory.h>
    #include <math.h>
    #include <string>
    #include <vector>
    #include <set>
    #include <stack>
    #include <queue>
    #include <algorithm>
    #include <map>
    
    
    #define I scanf
    #define OL puts
    #define O printf
    #define F(a,b,c) for(a=b;a<c;a++)
    #define FF(a,b) for(a=0;a<b;a++)
    #define FG(a,b) for(a=b-1;a>=0;a--)
    #define LEN 1010
    #define MAX (1<<30)-1
    #define V vector<int>
    
    using namespace std;
    
    int n,m,s,e; 
    int team_set[LEN];
    int g[LEN][LEN];
    int way_cnt[LEN];
    int vis[LEN];
    int dist[LEN];
    int team[LEN];
    
    int main(){
    //    freopen("D:\CbWorkspace\PAT\最短路径\1003.txt","r",stdin);
        int a,b,c,i;
        I("%d%d%d%d",&n,&m,&s,&e);
        FF(i,n) I("%d",&team_set[i]);
        fill(g[0],g[0]+LEN*LEN,MAX);
        fill(dist,dist+LEN,MAX);
        FF(i,m){
            I("%d%d%d",&a,&b,&c);
            g[a][b]=c;
            g[b][a]=c;
        }
        dist[s]=0;
        team[s]=team_set[s];
        way_cnt[s]=1;
        while(1){
            int u=-1,d=MAX;
            FF(i,n){
                if(!vis[i] && dist[i]<d){
                    u=i;
                    d=dist[i];
                }
            }
            if(u<0) break;
            vis[u]=1;
            FF(i,n) if(!vis[i]){
                if(dist[u]+g[u][i]<dist[i]){
                    dist[i]=dist[u]+g[u][i];
                    team[i]=team[u]+team_set[i];
                    way_cnt[i]=way_cnt[u];
                }else if(dist[u]+g[u][i]==dist[i]){
                    way_cnt[i]+=way_cnt[u];
                    if(team[i]<team[u]+team_set[i]){
                        team[i]=team[u]+team_set[i];
                    }
                }
            }
        }
        printf("%d %d
    ",way_cnt[e],team[e]);
        return 0;
    }

    bug出现在多条最短路径的更新问题上。没有写else if  而是写了  if  ,导致出错。

  • 相关阅读:
    有固态硬盘的电脑还是不流畅?这些值得了解
    一名神舟笔记本电脑用户的内心独白
    验证码无法显示:Could not initialize class sun.awt.X11GraphicsEnvironment 解决方案
    nginx 负载均衡时,一台tomcat宕机时的问题 自动切换
    tomcat结合nginx使用小结
    金九银十面试突击,卧底去阿里、京东、美团、腾讯带回来的面试题(内含答案)
    干货分享 ▏Jmeter-场景设置/运行/参数化访问地址/【一次性打包呈现】
    各类APP功能测试用例/设计方法/数据库和日记分析——【范本】
    软件测试这些坑,千万不要踩!
    技术面试中,遇到不会回答的问题怎么破?来,教3招!
  • 原文地址:https://www.cnblogs.com/TQCAI/p/8521992.html
Copyright © 2011-2022 走看看