zoukankan      html  css  js  c++  java
  • dijkstra+relax修改

     Frogger POJ - 2253 

    本题需要维护的不是最短路径的估计值,而是路径最大边权最小估计值

    因此只需要修改一下relax即可

    #include<iostream>
    #include<vector>
    #include<queue>
    #include<cmath>
    #include<cstring>
    using namespace std;
    #define inf 0x3f3f3f3f
    int n;
    
    struct node{
        int num;
        float x,y;
        float d;
        bool operator < (const node & re) const{
            return re.d<d;
        }
    };
    
    node nodes[1006];
    
    bool can[1007];
    void dijkstra()
    {
        memset(can,0,sizeof(can));
        for(int i=1;i<=n;i++) {
            nodes[i].d=inf,nodes[i].num=i;
            cin>>nodes[i].x>>nodes[i].y;
        }
        nodes[1].d=0;
        priority_queue<node>Q;
        Q.push(nodes[1]);
        while(!Q.empty())
        {
            node t=Q.top(); Q.pop();
            if(can[t.num]) continue;
            can[t.num]=1;
            for(int i=1;i<=n;i++){
                if(i==t.num) continue;
                nodes[i].d=min(nodes[i].d,max(nodes[t.num].d,sqrt((nodes[i].x-nodes[t.num].x)*(nodes[i].x-nodes[t.num].x)+(nodes[i].y-nodes[t.num].y)*(nodes[i].y-nodes[t.num].y) ) ));
                Q.push(nodes[i]);
            }
        }
    }
    
    int main()
    {
        int op=1;
        while(1)
        {
            cin>>n;
            if(n==0) break;
            dijkstra();
            cout<<"Scenario #"<<op<<endl;
            cout<<"Frog Distance = ";
            printf("%.3f
    
    ",nodes[2].d);
            op++;
        }
        return 0;
    }
    View Code

    Heavy Transportation

     POJ - 1797 

    本题需要维护的是路径最小边权最大估计值

    同样是修改relax为:

    nodes[v].d=max(nodes[v].d, min(nodes[u].d,w) );
    #include<iostream>
    #include<vector>
    #include<queue>
    #include<cmath>
    #include<cstring>
    using namespace std;
    #define inf 0x3f3f3f3f
    int n,m;
    struct node{
        int num;
        int d;
        bool operator < (const node & re) const{
            return re.d>d;
        }
    };
    node nodes[1007];
    
    struct side{
        int v;
        int w;
        side(int _v,int _w):v(_v),w(_w){}
    };
    vector<side>sides[1006];
    
    bool can[1006];
    void dij()
    {
        memset(can,0,sizeof(can));
        for(int i=1;i<=n;i++){
            nodes[i].num=i; nodes[i].d=0;
        }
        nodes[1].d=inf;
        priority_queue<node>Q;
        Q.push(nodes[1]);
        while(!Q.empty())
        {
            node t=Q.top(); Q.pop();
            if(can[t.num]) continue;
            can[t.num]=1;
            for(int i=0;i<sides[t.num].size();i++)
            {
                int u=t.num,v=sides[t.num][i].v,w=sides[t.num][i].w;
                nodes[v].d=max(nodes[v].d, min(nodes[u].d,w) );
                Q.push(nodes[v]);
            }
        }
    }
    int main()
    {
        int T;
        cin>>T;
        for(int yy=1;yy<=T;yy++)
        {
            for(int i=0;i<1005;i++) sides[i].clear();
            cin>>n>>m;
            for(int i=1;i<=m;i++)
            {
                int a,b,c; cin>>a>>b>>c;
                sides[a].push_back(side(b,c));
                sides[b].push_back(side(a,c));
            }
            dij();
            cout<<"Scenario #"<<yy<<":
    "<<nodes[n].d<<endl<<endl;
        }
        return 0;
    }
    View Code
  • 相关阅读:
    课堂讨论及思考
    问题账户需求分析
    阅读计划
    我们应当怎样做需求分析
    常用JavaScript触发事件
    form表单的字符串进行utf-8编码
    关于编码
    JavaScript弹窗
    测试
    感谢博客园
  • 原文地址:https://www.cnblogs.com/liuyongliu/p/11831325.html
Copyright © 2011-2022 走看看