zoukankan      html  css  js  c++  java
  • 1030 Travel Plan (30 分)(最短路径 and dfs)

    #include<bits/stdc++.h>
    
    using namespace std;
    const int N=510;
    const int inf=0x3f3f3f3f;
    int mp[N][N];
    bool vis[N];
    int dis[N];
    int n,m,s,D;
    int cost[N][N];
    vector<int>path[N];
    void Dijkstra()
    {
        fill(vis,vis+N,false);
        fill(dis,dis+N,inf);
        for(int i=0;i<n;i++) dis[i]=mp[s][i];
        dis[s]=0;
        for(int i=0;i<n-1;i++){
            int u=-1;
            int minn=inf;
            for(int j=0;j<n;j++){
                if(!vis[j]&&dis[j]<minn){
                    u=j;
                    minn=dis[j];
                }
            }
            if(u==-1) return;
            vis[u]=true;
            for(int j=0;j<n;j++){
                if(!vis[j]&&dis[u]+mp[u][j]<=dis[j]){
                    if(mp[u][j]+dis[u]<dis[j]){
                        dis[j]=mp[u][j]+dis[u];
                        path[j].clear();
                        path[j].push_back(u);
                    }
                    else{
                        path[j].push_back(u);
                    }
                }
            }
    
        }
    }
    vector<int>t,p;
    int minn=inf;
    void dfs(int v)
    {
    
        if(v==s){
            t.push_back(v);
            int sum=0;
            for(int i=t.size()-1;i>0;i--){
                int a=t[i];
                int b=t[i-1];
                sum+=cost[a][b];
            }
            if(sum<minn){
                minn=sum;
                p=t;
            }
            t.pop_back();
            return;
        }
        t.push_back(v);
        for(int i=0;i<path[v].size();i++){
            dfs(path[v][i]);
        }
        t.pop_back();
    
    }
    int main()
    {
        fill(cost[0],cost[0]+N*N,0);
        fill(mp[0],mp[0]+N*N,inf);
        scanf("%d %d %d %d",&n,&m,&s,&D);
        while(m--){
            int a,b,c,d;
            scanf("%d %d %d %d",&a,&b,&c,&d);
            mp[a][b]=mp[b][a]=c;
            cost[a][b]=cost[b][a]=d;
        }
        Dijkstra();
        dfs(D);
        for(int i=p.size()-1;i>=0;i--){
            printf("%d ",p[i]);
        }
        printf("%d %d
    ",dis[D],minn);
        return 0;
    }
  • 相关阅读:
    ValueStack、ActionContext
    s debug
    1923: [Sdoi2010]外星千足虫
    1013: [JSOI2008]球形空间产生器sphere
    HDU 3923 Invoker
    poj 1286 Necklace of Beads
    HDU 3037:Saving Beans
    2440: [中山市选2011]完全平方数
    1101: [POI2007]Zap
    1968: [Ahoi2005]COMMON 约数研究
  • 原文地址:https://www.cnblogs.com/chenchen-12/p/10127464.html
Copyright © 2011-2022 走看看