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  ,导致出错。

  • 相关阅读:
    机器学习之线性回归
    Anaconda使用
    Pycharm使用总结
    Mysql使用小tips
    技术转型与考研总结
    C语言的学习
    python 使用小结
    RedHat Linux 忘记密码
    设计模式之单例模式
    Java 读写Properties配置文件
  • 原文地址:https://www.cnblogs.com/TQCAI/p/8521992.html
Copyright © 2011-2022 走看看