• 1111 Online Map (30 分)


    这是真的水,就是写起来烦(摊手)。

    题意

    给定一个图、一个起点和一个终点,求一条距离最短的路径,如果有多条距离最短的路径,从中选择时间最短的一条,数据保证唯一性;再求一条时间最少的路径,如果有多条时间最少的路径,从中选择路径上顶点个数最少的一条,数据保证唯一性。如果距离最短和时间最少的是同一条路径,那么合并着输出。

    注意点

    1. 注意题意,有多条最短距离路径和多条最少时间路径的处理不是对称的!当有多条最短距离路径时,应当选择时间最少的路径;而当有多条最少时间路径时,应当选择顶点个数最少的路径!
    2. 建议使用vector来存放最优路径,以方便对两条最优路径进行相等性的比较。
    const int N=510;
    struct Node
    {
        int v;
        int len,tim;
    };
    vector<Node> g[N];
    vector<int> dispath,timpath;
    int dist1[N],dist2[N];
    bool vis[N];
    int pre[N];
    int f[N];
    int num[N];
    int n,m,st,ed;
    
    void dijkstra1(int dist[])
    {
        memset(dist,0x3f,4*N);
        memset(vis,0,sizeof vis);
        memset(pre,-1,sizeof pre);
        dist[st]=0;
        f[st]=0;
        priority_queue<PII,vector<PII>,greater<PII>> heap;
        heap.push({0,st});
    
        while(heap.size())
        {
            int t=heap.top().se;
            heap.pop();
    
            if(vis[t]) continue;
            vis[t]=true;
    
            for(int i=0;i<g[t].size();i++)
            {
                int j=g[t][i].v,w=g[t][i].len,cost=g[t][i].tim;
                if(dist[j] > dist[t] + w)
                {
                    dist[j]=dist[t]+w;
                    f[j]=f[t]+cost;
                    pre[j]=t;
                    heap.push({dist[j],j});
                }
                else if(dist[j] == dist[t]+w && f[j] > f[t]+cost)
                {
                    f[j]=f[t]+cost;
                    pre[j]=t;
                }
            }
        }
    }
    
    void dijkstra2(int dist[])
    {
        memset(dist,0x3f,4*N);
        memset(vis,0,sizeof vis);
        memset(pre,-1,sizeof pre);
        dist[st]=0;
        num[st]=1;
        priority_queue<PII,vector<PII>,greater<PII>> heap;
        heap.push({0,st});
    
        while(heap.size())
        {
            int t=heap.top().se;
            heap.pop();
    
            if(vis[t]) continue;
            vis[t]=true;
    
            for(int i=0;i<g[t].size();i++)
            {
                int j=g[t][i].v,w=g[t][i].len,cost=g[t][i].tim;
                if(dist[j] > dist[t] + cost)
                {
                    dist[j]=dist[t]+cost;
                    num[j]=num[t]+1;
                    pre[j]=t;
                    heap.push({dist[j],j});
                }
                else if(dist[j] == dist[t]+cost && num[j] > num[t]+1)
                {
                    num[j]=num[t]+1;
                    pre[j]=t;
                }
            }
        }
    }
    
    void get_path(int x,vector<int> &path)
    {
        if(x == -1) return;
        get_path(pre[x],path);
        path.pb(x);
    }
    
    int main()
    {
        cin>>n>>m;
    
        while(m--)
        {
            int a,b,t,len,tim;
            cin>>a>>b>>t>>len>>tim;
            g[a].pb({b,len,tim});
            if(t == 0) g[b].pb({a,len,tim});
        }
    
        cin>>st>>ed;
    
        dijkstra1(dist1);
        get_path(ed,dispath);
    
        dijkstra2(dist2);
        get_path(ed,timpath);
    
        if(dispath == timpath)
        {
            printf("Distance = %d; Time = %d: ",dist1[ed],dist2[ed]);
            for(int i=0;i<dispath.size();i++)
                if(i) cout<<" -> "<<dispath[i];
                else cout<<dispath[i];
            cout<<endl;
        }
        else
        {
            printf("Distance = %d: ",dist1[ed]);
            for(int i=0;i<dispath.size();i++)
                if(i) cout<<" -> "<<dispath[i];
                else cout<<dispath[i];
            cout<<endl;
            printf("Time = %d: ",dist2[ed]);
            for(int i=0;i<timpath.size();i++)
                if(i) cout<<" -> "<<timpath[i];
                else cout<<timpath[i];
            cout<<endl;
        }
    
        //system("pause");
        return 0;
    }
    
  • 相关阅读:
    js_css_dl.dt实现列表展开、折叠效果
    property_自己编写一个读取Property文件的Util类
    HttpClient_002_中文乱码、HttpClient中文乱码透析、总结
    HttpClient_001_初步实现项目01的servlet,与项目02的servlet,之间数据访问
    jsp:中文乱码解决
    linux命令
    js 监测from表单中的input和select,时时监测,没有输入或选择信息报错,不允许提交数据
    数据库的那些事
    待参考
    layer.open多次触发,遮罩层覆盖content的解决办法
  • 原文地址:https://www.cnblogs.com/fxh0707/p/14468401.html
Copyright © 2020-2023  润新知