| ||||||||||
| Online Judge | Problem Set | Authors | Online Contests | User | ||||||
|---|---|---|---|---|---|---|---|---|---|---|
| Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest | |||||||||
Re:贴个c++代码, 再贴几组数据, 建议不要用数组, 不太好估计大小In Reply To:贴个c++代码, 再贴几组数据, 建议不要用数组, 不太好估计大小 Posted by:a280920481 at 2018-12-10 23:35:01 > #include <iostream>
> #include <vector>
> using namespace std;
>
> const int Vam = 5000;
> const int INF = 1 << 20;
>
> const int px[4] = { -1,0,0,1 };
> const int py[4] = { 0,-1,1,0 };
>
> struct Situ
> {
> int x;
> int y;
> int d;
> }que[150];
> bool serched[14][14];
>
> vector<int> G[Vam];
> int match[Vam];
> bool used[Vam];
>
> void add_edge(int u, int w);
> bool dfs(int v);
>
> int X, Y, X_Y;
>
> int room[14][14];
> int roomnum[14][14];
> int pnum, dnum;
> int mindistance[150][50];
>
> bool bfs(int sx, int sy);
>
> int main()
> {
> int casen, st, p;
> char ch;
> bool flag;
>
> cin >> casen;
>
> while (casen--)
> {
> pnum = 0;
> dnum = 0;
> st = 0;
>
> for (int i = 0; i < 14; i++)
> {
> for (int j = 0; j < 14; j++)
> {
> room[i][j] = 0;
> roomnum[i][j] = 0;
> }
> }
>
> for (int i = 0; i < 150; i++)
> {
> for (int j = 0; j < 50; j++)
> {
> mindistance[i][j] = INF;
> }
> }
>
> for (int i = 0; i < Vam; i++)
> {
> G[i].clear();
> match[i] = -1;
> used[i] = false;
> }
>
> cin >> X >> Y;
> X_Y = X * Y;
>
> for (int i = 1; i <= X; i++)
> {
> for (int j = 1; j <= Y; j++)
> {
> cin >> ch;
> switch (ch)
> {
> case '.':
> room[i][j] = 1;
> roomnum[i][j] = pnum++;
> break;
> case 'D':
> room[i][j] = 2;
> roomnum[i][j] = dnum++;
> break;
> case 'X':
> room[i][j] = 0;
> break;
> }
> }
> }
>
> for (int i = 1; i <= X; i++)
> {
> for (int j = 1; j <= Y; j++)
> {
> if (room[i][j] == 2)
> {
> roomnum[i][j] += pnum;
> }
> }
> }
>
> flag = false;
> for (int i = 2; i < X; i++)
> {
> for (int j = 2; j < Y; j++)
> {
> if (room[i][j])
> {
> if (bfs(i, j))
> {
> flag = true;
> }
> }
> }
> }
> if (flag)
> {
> cout << "impossible\n";
> continue;
> }
>
> p = 0;
> for (st = 0; (st < X_Y) && (p < pnum); st++)
> {
> for (int i = 0; i < pnum; i++)
> {
> for (int j = 0; j < dnum; j++)
> {
> if (mindistance[i][j] - 1 <= st)
> {
> add_edge(i, pnum + st * dnum + j);
> }
> }
> }
>
> for (int i = 0; i < Vam; i++)
> {
> used[i] = false;
> }
>
> for (int i = 0; i < dnum; i++)
> {
> if (dfs(pnum + st * dnum + i))
> {
> p++;
> }
> }
> }
>
> cout << st << '\n';
>
> }
> return 0;
> }
>
> void add_edge(int u, int w)
> {
> G[u].push_back(w);
> G[w].push_back(u);
> return;
> }
>
> bool dfs(int v)
> {
> int u, w;
>
> used[v] = true;
>
> for (int i = 0; i < G[v].size(); i++)
> {
> u = G[v][i];
> w = match[u];
>
> if (w < 0)
> {
> match[v] = u;
> match[u] = v;
> return true;
> }
> else if (!used[w])
> {
> if (dfs(w))
> {
> match[v] = u;
> match[u] = v;
> return true;
> }
> }
> }
>
> return false;
> }
>
> bool bfs(int sx, int sy)
> {
> static Situ m, s;
> int qb = 0, qf = 0;
> bool flag = true;
>
> for (int i = 0; i < 14; i++)
> {
> for (int j = 0; j < 14; j++)
> {
> serched[i][j] = false;
> }
> }
>
> s.x = sx;
> s.y = sy;
> s.d = 0;
>
> que[qf++] = s;
>
> while (qf > qb)
> {
> m = que[qb++];
>
> for (int i = 0; i < 4; i++)
> {
> s.x = m.x + px[i];
> s.y = m.y + py[i];
> s.d = m.d + 1;
> if ((!serched[s.x][s.y]) && room[s.x][s.y])
> {
> serched[s.x][s.y] = true;
>
> if (room[s.x][s.y] == 2)
> {
> mindistance[roomnum[sx][sy]][roomnum[s.x][s.y] - pnum] = s.d;
> flag = false;
> }
> else
> {
> que[qf++] = s;
> }
> }
> }
> }
>
> return flag;
> }
>
> /*
> 数据直接 Ctrl + C 复制, 再 Ctrl + V 粘贴就行
>
> 数据:
>
> 9
>
> 5 5
> XDXXX
> X...X
> X.X.X
> X...X
> XXXXX
>
> 5 12
> XXXXXXXXXXXX
> X..........D
> X.XXXXXXXXXX
> X..........X
> DDDDDDDDDDDD
>
> 12 12
> DDDDDDDDDDDD
> D..........D
> D..........D
> D..........D
> D..........D
> D..........D
> D..........D
> D..........D
> D..........D
> D..........D
> D..........D
> DDDDDDDDDDDD
>
> 12 12
> XXXXXXXXXXDD
> X..........X
> X.XXXXXXXXXX
> X..........X
> XXXXXXXXXX.X
> X..........X
> X.XXXXXXXXXX
> X..........X
> XXXXXXXXXX.X
> X..........X
> X.X.X.X.X..X
> XXXXXXXXXXXX
>
> 12 12
> XXXXXXXXXXDX
> X..........D
> X.XXXXXXXXXX
> X..........X
> XXXXXXXXXX.X
> X..........X
> X.XXXXXXXXXX
> X..........X
> XXXXXXXXXX.X
> X..........X
> X.X.X.X.X..X
> XXXXXXXXXXXX
>
> 12 12
> XXXXXXXXXXDX
> X..........D
> X.XXXXXXXXXX
> X..........D
> XXXXXXXXXX.X
> X..........X
> X.XXXXXXXXXX
> X..........X
> XXXXXXXXXX.X
> X..........X
> X.X.X.X.X..X
> XXXXXXXXXXDX
>
> 6 6
> XDXXXX
> D....D
> X.X..X
> X.XX.X
> X...XX
> XXXDXX
>
> 5 5
> XXXXX
> X...D
> X.XXX
> X...D
> XXXXX
>
> 7 6
> XXXXXX
> X....D
> XXXX.X
> X....X
> X.XXXX
> X....X
> XXDXXX
>
>
> 结果:
>
> 8
> 6
> 5
> 60
> 55
> 22
> 4
> 4
> 7
>
> */
Followed by:
Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator