• URAL 1003,1004


    1003:

    并查集在处理矛盾关系的应用,讲的比较好的题解

    #include <map>
    #include <set>
    #include <list>
    #include <queue>
    #include <stack>
    #include <cmath>
    #include <ctime>
    #include <vector>
    #include <bitset>
    #include <cstdio>
    #include <string>
    #include <numeric>
    #include <cstring>
    #include <cstdlib>
    #include <iostream>
    #include <algorithm>
    #include <functional>
    using namespace std;
    typedef long long  ll;
    typedef unsigned long long ull;
    
    int dx[4]={-1,1,0,0};
    int dy[4]={0,0,-1,1};//up down left right
    bool inmap(int x,int y,int n,int m){if(x<1||x>n||y<1||y>m)return false;return true;}
    int hashmap(int x,int y,int m){return (x-1)*m+y;}
    
    #define eps 1e-8
    #define inf 0x7fffffff
    #define debug puts("BUG")
    #define lson l,m,rt<<1
    #define rson m+1,r,rt<<1|1
    #define read freopen("in.txt","r",stdin)
    #define write freopen("out.txt","w",stdout)
    #define N 11111
    
    map<int,int>mp;
    struct node
    {
        int l,r;
        char c;
    }nd[N>>1];
    int fa[N<<1];
    int find(int x)
    {
        if (fa[x]!=x)
            fa[x] = find(fa[x]);
        return fa[x];
    }
    
    int gao(int m,int cnt)
    {
        for (int i = 0; i < m; ++i)
        {
            int l = mp[nd[i].l-1], r= mp[nd[i].r];
            char c = nd[i].c;
            int f1 = find(l), f2 = find(r), f3 = find(l+cnt), f4 = find(r+cnt);
            if (c == 'e')
            {
                if (f1 == f4 && f2 == f3)
                    return i;
                fa[f1] = f2;
                fa[f3] = f4;
            }
            else
            {
                if (f1 == f2)
                    return i;
                fa[f1] = f4;
                fa[f2] = f3;
            }
        }
        return m;
    }
    int main()
    {
        //read;
        int n,m;
        while (~scanf("%d",&n))
        {
            if (n == -1) break;
            scanf("%d",&m);
            mp.clear();
            int l, r, cnt = 0;
            char str[11];
            for (int i = 0; i < m; ++i)
            {
                scanf("%d%d%s",&l,&r,str);
                nd[i].l = l, nd[i].r = r;
                nd[i].c = str[0];
                if (mp.find(l-1) == mp.end())
                    mp[l-1] = cnt++;
                if (mp.find(r) == mp.end())
                    mp[r] = cnt++;
            }
            for (int i = 0; i < 2*cnt; ++i)
                fa[i] = i;
            int ans = gao(m,cnt);
            printf("%d
    ", ans);
        }
        return 0;
    }

    1004:

    能够加深对floyd理解的好题,当然还有另外的做法

    #include <map>
    #include <set>
    #include <list>
    #include <queue>
    #include <stack>
    #include <cmath>
    #include <ctime>
    #include <vector>
    #include <bitset>
    #include <cstdio>
    #include <string>
    #include <numeric>
    #include <cstring>
    #include <cstdlib>
    #include <iostream>
    #include <algorithm>
    #include <functional>
    using namespace std;
    typedef long long  ll;
    typedef unsigned long long ull;
    
    int dx[4]={-1,1,0,0};
    int dy[4]={0,0,-1,1};//up down left right
    bool inmap(int x,int y,int n,int m){if(x<1||x>n||y<1||y>m)return false;return true;}
    int hashmap(int x,int y,int m){return (x-1)*m+y;}
    
    #define eps 1e-8
    #define inf 0x7ffffff
    #define debug puts("BUG")
    #define lson l,m,rt<<1
    #define rson m+1,r,rt<<1|1
    #define read freopen("in.txt","r",stdin)
    #define write freopen("out.txt","w",stdout)
    #define N 155
    int mp[N][N];
    int dis[N][N];
    int nxt[N][N];
    stack<int>st;
    int floyd(int n)
    {
        int ans = inf;
        for (int k = 1; k <= n; ++k)
        {
            for (int i = 1; i < k; ++i)
                for (int j = i+1; j < k; ++j)
                {
                    if (ans > dis[i][j] + mp[k][i] + mp[j][k])
                    {
                        ans = dis[i][j] + mp[k][i] + mp[j][k];
                        while (!st.empty())
                            st.pop();
                        for (int t = i; t != j; t = nxt[t][j])
                            st.push(t);
                        st.push(j);
                        st.push(k);
                    }
                }
            for (int i = 1; i <= n; ++i)
                for (int j = 1; j <= n; ++j)
                {
                    if (dis[i][k] == inf || dis[k][j] == inf)
                        continue;
                    if (dis[i][k] + dis[k][j] < dis[i][j])
                    {
                        dis[i][j] = dis[i][k] + dis[k][j];
                        nxt[i][j] = nxt[i][k];
                    }
                }
        }
        return ans;
    }
    int main()
    {
        //read;
        int n,m;
        while (~scanf("%d",&n))
        {
            if (n == -1)break;
            scanf("%d",&m);
            for (int i = 1; i <= n; ++i)
                for (int j = 1; j <= n; ++j)
                {
                    dis[i][j] = mp[i][j] = inf;
                    nxt[i][j] = j;
                }
            int u,v,c;
            for (int i = 0; i < m; ++i)
            {
                scanf("%d%d%d",&u, &v, &c);
                if (mp[u][v] > c)
                    mp[u][v] = mp[v][u] = dis[u][v] = dis[v][u] = c;
            }
            int ans = floyd(n);
            //printf("%d
    ",ans);
            if (ans == inf)
                puts("No solution.");
            else
            {
                bool f = false;
                while (!st.empty())
                {
                    if (f) printf(" ");
                    else f = true;
                    printf("%d",st.top());
                    st.pop();
                }puts("");
            }
        }
        return 0;
    }
  • 相关阅读:
    SA (后缀数组) 学习笔记
    loj2318 「NOIP2017」宝藏[状压DP]
    hdu4352 XHXJ's LIS[数位DP套状压DP+LIS$O(nlogn)$]
    【鸽】poj3311 Hie with the Pie[状压DP+Floyd]
    P1879 [USACO06NOV]玉米田Corn Fields[轮廓线DP]
    hdu4507 吉哥系列故事——恨7不成妻[数位DP]
    BZOJ3329 Xorequ[数位DP+递推矩阵快速幂]
    poj1015 Jury Compromise[背包]
    hdu3586 Information Disturbing[二分答案+树形DP]
    BZOJ4247 挂饰[背包]
  • 原文地址:https://www.cnblogs.com/mcflurry/p/4809807.html
Copyright © 2020-2023  润新知