zoukankan      html  css  js  c++  java
  • Travelling Businessmen Problem

    Travelling Businessmen Problem

    先求出图的两个部分,可能只有一个部分

    然后用set模拟,得到不同部分差最小的

    #include <bits/stdc++.h>
     
    using namespace std;
    typedef long long ll;
     
    const int maxn = 1e5+7;
    int n,m;
    struct cha
    {
        int u,v,w;
        bool operator<(const cha&r)const
        {
            if(w!=r.w) return w<r.w;
            else if(u!=r.u) return v<r.v;
            return u<r.u;
        }
    } tmp;
    struct node
    {
        int u,col,w;
        bool operator<(const node&r)const
        {
            if(w!=r.w) return w>r.w;
            else if(col!=r.col) return col<r.col;
            return u>r.u;
        }
    };
    set<cha>ans;
    set<node>st;
    vector<int>G[maxn];
    int val[maxn];
    int us[maxn],vis[maxn];
    void dfs(int u,int w)
    {
        if(w==1) us[u]=1;
        else if(w==-1) vis[u]=1;
        for(int v:G[u])
        {
            if(w==-1&&!us[v])
            {
                dfs(v,1);
            }
            else if(w==1&&!vis[v])
            {
                dfs(v,-1);
            }
        }
    }
    void init()
    {
        st.clear();
        ans.clear();
        for(int i=1; i<=n; ++i)
        {
            st.insert(node{i,us[i],val[i]});
        }
        set<node>::iterator it,itt;
        it=st.begin();
        itt=it,++itt;
        int u,v,w;
        while(itt!=st.end())
        {
            if((*it).col!=(*itt).col)
            {
                u=(*it).u;
                v=(*itt).u;
                w=abs((*it).w-(*itt).w);
                if(u>v) swap(u,v);
                tmp=cha{u,v,w};
                ans.insert(tmp);
            }
            it++;
            itt++;
        }
    }
    void del(int i)
    {
        node p{i,us[i],val[i]};
        set<node>::iterator it,itt,a,b;
        it=st.find(p);
        int u,v,w;
        if(it!=st.begin())
        {
            itt=it;
            --itt;
            a=itt;
            if((*itt).col!=(*it).col)
            {
                u=(*it).u;
                v=(*itt).u;
                w=abs((*it).w-(*itt).w);
                if(u>v) swap(u,v);
                tmp=cha{u,v,w};
                ans.erase(tmp);
            }
        }
        itt=st.end();
        --itt;
        if(it!=itt)
        {
            itt=it;
            ++itt;
            b=itt;
            if((*itt).col!=(*it).col)
            {
                u=(*it).u;
                v=(*itt).u;
                w=abs((*it).w-(*itt).w);
                if(u>v) swap(u,v);
                tmp=cha{u,v,w};
                ans.erase(tmp);
            }
            if(it!=st.begin())
            {
                if((*a).col!=(*b).col)
                {
                    u=(*a).u;
                    v=(*b).u;
                    w=abs((*a).w-(*b).w);
                    if(u>v) swap(u,v);
                    tmp=cha{u,v,w};
                    ans.insert(tmp);
                }
            }
        }
        st.erase(it);
    }
    void ins(int i,int c)
    {
        val[i]=c;
        node p{i,us[i],val[i]};
        st.insert(p);
        set<node>::iterator it,itt,a,b;
        it=st.find(p);
        int u,v,w;
        if(it!=st.begin())
        {
            itt=it;
            --itt;
            a=itt;
            if((*itt).col!=(*it).col)
            {
                u=(*it).u;
                v=(*itt).u;
                w=abs((*it).w-(*itt).w);
                if(u>v) swap(u,v);
                tmp=cha{u,v,w};
                ans.insert(tmp);
            }
        }
        itt=st.end();
        --itt;
        if(it!=itt)
        {
            itt=it;
            ++itt;
            b=itt;
            if((*itt).col!=(*it).col)
            {
                u=(*it).u;
                v=(*itt).u;
                w=abs((*it).w-(*itt).w);
                if(u>v) swap(u,v);
                tmp=cha{u,v,w};
                ans.insert(tmp);
            }
            if(it!=st.begin())
            {
                if((*a).col!=(*b).col)
                {
                    u=(*a).u;
                    v=(*b).u;
                    w=abs((*a).w-(*b).w);
                    if(u>v) swap(u,v);
                    tmp=cha{u,v,w};
                    ans.erase(tmp);
                }
            }
        }
    }
    void solve()
    {
        int Q;
        scanf("%d",&Q);
        int op,u,v;
        while(Q--)
        {
            scanf("%d%d%d",&op,&u,&v);
            if(op==0)
            {
                del(u);
                ins(u,v);
            }
            else
            {
                if(us[u]==us[v])
                {
                    puts("0");
                }
                else
                {
                    printf("%d
    ",(*ans.begin()).w);
                }
            }
        }
    }
    int main()
    {
        while(scanf("%d%d",&n,&m)!=EOF)
        {
            for(int i=1; i<=n; ++i)
            {
                scanf("%d",&val[i]);
                G[i].clear();
                us[i]=vis[i]=0;
            }
            for(int i=1,u,v; i<=m; ++i)
            {
                scanf("%d%d",&u,&v);
                G[u].push_back(v);
                G[v].push_back(u);
            }
            dfs(1,1);
            init();
            solve();
        }
        return 0;
    }
    
  • 相关阅读:
    【02】Nginx:基本配置和日志处理
    【01】Nginx:编译安装/动态添加模块
    【09】Jenkins:Pipeline 补充
    【08】Jenkins:关于发布
    【07】Jenkins:流水线(Pipeline)
    【06】Jenkins:Gitlab 自动触发构建以及钉钉通知
    【05】Jenkins:用户权限管理
    【04】Jenkins:基本功能补充说明
    【03】Jenkins:SonarQube
    【02】Jenkins:第一个项目
  • 原文地址:https://www.cnblogs.com/smallocean/p/11518549.html
Copyright © 2011-2022 走看看