zoukankan      html  css  js  c++  java
  • Fire Game FZU

    其实写一个spfa就行  遍历所有的草的点  组合两个

    求最大时间的最小

    #include <iostream>
    #include <cstdio>
    #include <sstream>
    #include <cstring>
    #include <map>
    #include <cctype>
    #include <set>
    #include <vector>
    #include <stack>
    #include <queue>
    #include <algorithm>
    #include <list>
    #include <cmath>
    #include <bitset>
    #define rap(i, a, n) for(int i=a; i<=n; i++)
    #define rep(i, a, n) for(int i=a; i<n; i++)
    #define lap(i, a, n) for(int i=n; i>=a; i--)
    #define lep(i, a, n) for(int i=n; i>a; i--)
    #define rd(a) scanf("%d", &a)
    #define rlld(a) scanf("%lld", &a)
    #define rc(a) scanf("%c", &a)
    #define rs(a) scanf("%s", a)
    #define rb(a) scanf("%lf", &a)
    #define rf(a) scanf("%f", &a)
    #define pd(a) printf("%d
    ", a)
    #define plld(a) printf("%lld
    ", a)
    #define pc(a) printf("%c
    ", a)
    #define ps(a) printf("%s
    ", a)
    #define MOD 2018
    #define LL long long
    #define ULL unsigned long long
    #define Pair pair<int, int>
    #define mem(a, b) memset(a, b, sizeof(a))
    #define _  ios_base::sync_with_stdio(0),cin.tie(0)
    //freopen("1.txt", "r", stdin);
    using namespace std;
    const int maxn = 110000, INF = 0x7fffffff;
    
    int n, m;
    string str[15];
    int dis[4][2] = {{1, 0},{-1, 0},{0, 1},{0, -1}};
    int vis[15][15], vis1[15][15], d[15][15];
    
    
    void dfs(int x, int y, int cnt)
    {
        for(int i = 0; i < 4; i++)
        {
            int nx = x + dis[i][0];
            int ny = y + dis[i][1];
            if(nx < 0 || nx >= n || ny < 0 || ny >=m || str[nx][ny] == '.' || vis[nx][ny]) continue;
            vis[nx][ny] = cnt;
            dfs(nx, ny, cnt);
        }
    }
    
    struct node
    {
        int x, y;
        node(int x, int y) : x(x), y(y) {}
    };
    
    int spfa(int x, int y)
    {
        for(int i = 0; i <= n; i++)
            for(int j = 0; j <= m; j++) d[i][j] = INF;
        vector<node> f;
        mem(vis1, 0);
        queue<node> Q;
        Q.push(node(x, y));
        vis1[x][y] = 1;
        d[x][y] = 0;
        while(!Q.empty())
        {
            node u = Q.front(); Q.pop();
            f.push_back(u);
            vis1[u.x][u.y] = 0;
            for(int i = 0; i < 4; i++)
            {
                node t = node(0, 0);
                t.x = u.x + dis[i][0];
                t.y = u.y + dis[i][1];
                if(t.x < 0 || t.x >= n || t.y < 0 || t.y >= m || str[t.x][t.y] == '.') continue;
                if(d[t.x][t.y] > d[u.x][u.y] + 1)
                {
                    d[t.x][t.y] = d[u.x][u.y] + 1;
                    if(!vis1[t.x][t.y])
                    {
                        vis1[t.x][t.y] = 1;
                        Q.push(t);
                    }
    
                }
    
    
            }
        }
        int mx = -INF;
        for(int i = 0; i < f.size(); i++)
        {
    
            mx = max(mx, d[f[i].x][f[i].y]);
        }
        return mx;
    }
    
    
    
    
    set<int> s1, s2;
    
    vector<node> G;
    
    
    int bfs(int x1, int y1, int x2, int y2)
    {
        queue<node> Q;
        for(int i = 0; i <= n; i++)
            for(int j = 0; j <= m; j++) d[i][j] = INF;
        vector<node> f;
        d[x1][y1] = d[x2][y2] = 0;
        Q.push(node(x1, y1)); Q.push(node(x2, y2));
        mem(vis1, 0);
        vis1[x1][y1] = 1, vis1[x2][y2] = 1;
        while(!Q.empty())
        {
            node u = Q.front(); Q.pop();
            f.push_back(u);
            vis1[u.x][u.y] = 0;
            for(int i = 0; i < 4; i++)
            {
                node t = node(0, 0);
                t.x = u.x + dis[i][0];
                t.y = u.y + dis[i][1];
                if(t.x < 0 || t.x >= n || t.y < 0 || t.y >= m || str[t.x][t.y] == '.') continue;
                if(d[t.x][t.y] > d[u.x][u.y] + 1)
                {
                    d[t.x][t.y] = d[u.x][u.y] + 1;
                    if(!vis1[t.x][t.y])
                    {
                        vis1[t.x][t.y] = 1;
                        Q.push(t);
                    }
    
                }
    
    
            }
        }
        int mx = -INF;
        for(int i = 0; i < f.size(); i++)
        {
    
            mx = max(mx, d[f[i].x][f[i].y]);
        }
        return mx;
    
    }
    
    
    int main()
    {
        int T, kase = 0;
        rd(T);
        while(T--)
        {
            s1.clear();
            s2.clear();
            mem(vis, 0);
    
            int cnt = 0;
            G.clear();
            rd(n), rd(m);
            for(int i = 0; i < n; i++)
            {
                cin >> str[i];
                for(int j = 0; j < m; j++)
                    if(str[i][j] == '#') G.push_back(node(i, j));
    
    
            }
          //  cout << 11111 <<endl;
            for(int i = 0; i < n; i++)
                for(int j = 0; j < m; j++)
                    if(!vis[i][j] && str[i][j] == '#')
                    {
                        cnt++;
                        vis[i][j] = cnt;
                        dfs(i, j, cnt);
                    }
            //cout << cnt << endl;
            printf("Case %d: ", ++kase);
            if(cnt > 2)
            {
                printf("-1
    ");
                continue;
            }
            if(cnt == 0)
            {
                printf("0
    ");
                continue;
    
            }
            if(cnt == 1)
            {
                for(int i = 0; i < G.size(); i++)
                {
                    node u1 = G[i];
                    for(int j = i + 1; j < G.size(); j++)
                    {
                        node u2 = G[j];
                        s1.insert(bfs(u1.x, u1.y, u2.x, u2.y));
                    }
                }
                set<int>::iterator it;
                it = s1.begin();
                cout << *it << endl;
                continue;
            }
    
    
            for(int i = 0; i < n; i++)
            {
                for(int j = 0; j < m; j++)
                {
                    if(str[i][j] == '#')
                    {
                        if(vis[i][j] == 1)
                            s1.insert(spfa(i, j));
                        else
                            s2.insert(spfa(i, j));
                    }
                }
            }
            set<int>::iterator it, is;
            it = s1.begin();
            is = s2.begin();
            int mxx = max(*it, *is);
            cout << mxx << endl;
    
        }
    
        return 0;
    }
  • 相关阅读:
    软件体系架构复习要点
    Operating System on Raspberry Pi 3b
    2019-2020 ICPC North-Western Russia Regional Contest
    2019 ICPC ShenYang Regional Online Contest
    2019 ICPC XuZhou Regional Online Contest
    2019 ICPC NanChang Regional Online Contest
    2019 ICPC NanJing Regional Online Contest
    Codeforces Edu Round 72 (Rated for Div. 2)
    Codeforces Round #583 (Div.1+Div.2)
    AtCoder Beginning Contest 139
  • 原文地址:https://www.cnblogs.com/WTSRUVF/p/10808927.html
Copyright © 2011-2022 走看看