UVALive 5903 Piece it together
来源:互联网 发布:禅道数据库迁移linux 编辑:程序博客网 时间:2024/05/08 09:09
一开始用的STL一直超时不能过,后来发现AC的代码基本都用的普通邻接表,然后改了一下13s,T=T,效率太低了。然后把某大神,详情戳链接http://acm.hust.edu.cn/vjudge/problem/viewSource.action?id=1199083的300+ms的代码加上自己的优化成功到了85ms,限时30s的程序还是挺有成就感的。
题目分析:
一个黑格子要和相邻的两个白格子构成一块,也就是成直角形状,因此,每个黑块必须和相邻上下白块中的一个匹配,同样左右白块必须也有一个和它匹配,将黑块拆成两个点, 这样问题就变成二分图的匹配问题了。
我的TLE的代码:
#include <iostream>#include <sstream>#include <cstdio>#include <climits>#include <cstring>#include <cstdlib>#include <string>#include <stack>#include <map>#include <cmath>#include <vector>#include <queue>#include <algorithm>#define esp 1e-6#define pi acos(-1.0)#define pb push_back#define lson l, m, rt<<1#define rson m+1, r, rt<<1|1#define mp(a, b) make_pair((a), (b))#define in freopen("in.txt", "r", stdin);#define out freopen("out.txt", "w", stdout);#define print(a) printf("%d\n",(a));#define bug puts("********))))))");#define stop system("pause");#define Rep(i, c) for(__typeof(c.end()) i = c.begin(); i != c.end(); i++)#define inf 0x0f0f0f0fusing namespace std;typedef long long LL;typedef vector<int> VI;typedef pair<int, int> pii;typedef vector<pii,int> VII;typedef vector<int>:: iterator IT;const int maxn = 555;char maze[maxn][maxn];int R, C;int flag[maxn * maxn];int match[maxn * maxn];VI g[maxn * maxn];vector<pii> BLK;bool dfs(int x){ for(int i = 0; i < g[x].size(); i++) { int v = g[x][i]; if(!flag[v]) { flag[v] = 1; if(match[v] == -1 || dfs(match[v])) { match[v] = x; return true; } } } return false;}int main(void){ int T, t; scanf("%d", &T); memset(maze, -1, sizeof(maze)); for(t = 1; t <= T; t++) { int b = 0, w = 0; BLK.clear(); for(int i = 0; i < maxn*maxn; i++) g[i].clear(); scanf("%d%d", &R, &C); while(getchar() != '\n') ; for(int i = 1; i <= R; i++) { scanf("%s", maze[i] + 1); for(int j = 1; j <= C; j++) if(maze[i][j] == 'B') b++, BLK.pb(mp(i, j)); else if(maze[i][j] == 'W') w++; } if(b*2 != w) puts("NO"); else { for(int i = 0; i < BLK.size(); i++) { int x = BLK[i].first; int y = BLK[i].second; if(maze[x-1][y] == 'W') g[i].pb((x-1)*C+y); if(maze[x+1][y] == 'W') g[i].pb((x+1)*C+y); if(maze[x][y-1] == 'W') g[i+b].pb(x*C+y-1); if(maze[x][y+1] == 'W') g[i+b].pb(x*C+y+1); } memset(match, -1, sizeof(match)); int i; for( i = 0; i < b; i++) { memset(flag, 0, sizeof(flag)); if(!dfs(i) || !dfs(i+b)) break; } if(i < b) puts("NO"); else puts("YES"); } } return 0;}
改后的代码:
#include <iostream>#include <sstream>#include <cstdio>#include <climits>#include <cstring>#include <cstdlib>#include <string>#include <stack>#include <map>#include <cmath>#include <vector>#include <queue>#include <algorithm>#define esp 1e-6#define pi acos(-1.0)#define pb push_back#define lson l, m, rt<<1#define rson m+1, r, rt<<1|1#define mp(a, b) make_pair((a), (b))#define in freopen("in.txt", "r", stdin);#define out freopen("out.txt", "w", stdout);#define print(a) printf("%d\n",(a));#define bug puts("********))))))");#define stop system("pause");#define Rep(i, c) for(__typeof(c.end()) i = c.begin(); i != c.end(); i++)#define inf 0x0f0f0f0fusing namespace std;typedef long long LL;typedef vector<int> VI;typedef pair<int, int> pii;typedef vector<pii> VII;typedef vector<pii, int> VIII;typedef VI:: iterator IT;int n,m;char s[600][600];int B[600][600];int W[600][600];int link[300000];int vis[300000];int b,w;VII BLK;struct bian{ int v,next;}e[1000000];int head[300000];int num;int now;void add(int u,int v){ e[num].v=v; e[num].next=head[u]; head[u]=num++;} bool dfs(int k){ for(int h=head[k];h!=-1;h=e[h].next) { int v=e[h].v; if(vis[v]==now) continue; vis[v]=now; if(link[v]==-1||dfs(link[v])) { link[v]=k; return 1; } } return 0;}int main(){ int T; scanf("%d",&T); while (T--) { BLK.clear(); num=0; memset(head,-1,sizeof(head)); scanf("%d%d",&n,&m); memset(s,0,sizeof(s)); for(int i=0;i<n;i++) scanf("%s",s[i]); b=w=0; for(int i=0;i<n;i++) for(int j=0;j<m;j++) { if(s[i][j]=='B') B[i][j]=++b, BLK.pb(mp(i, j)); if(s[i][j]=='W') W[i][j]=++w; } if(b*2!=w) { puts("NO"); continue; } else { for(int k = 0; k < BLK.size(); k++) { int i = BLK[k].first; int j = BLK[k].second; if(s[i][j]=='B') { if(s[i-1][j]=='W') add(B[i][j],W[i-1][j]); if(s[i+1][j]=='W') add(B[i][j],W[i+1][j]); if(s[i][j-1]=='W') add(B[i][j]+b,W[i][j-1]); if(s[i][j+1]=='W') add(B[i][j]+b,W[i][j+1]); } } memset(link,-1,sizeof(link)) ; memset(vis,0,sizeof(vis)); int i; for(i=1;i<=b*2;i++) { now=i; if(!dfs(i)) break; } if(i > b*2) puts("YES"); else puts("NO"); } } return 0;}
0 0
- UVALive 5903 Piece it together
- UVA1514 piece it together
- Uva1514 Piece it together
- UVA 1514 - Piece it together(二分图匹配+拆点)
- uva 1514 - Piece it together(2SAT)
- Get it together 打起精神
- Bringing It All Together
- Putting It All Together
- SpokenEnglish--It's a piece of cake
- Putting it Together: Understanding Pointers
- Bing it UVALive
- UVALive 4764 Bing it
- Bing it UVALive
- Together,
- UVALive 5063 Just Sum It
- piece by piece
- First piece
- One Piece!
- ZOJ - 2615 Cells
- UVA 11294 Wedding
- UVA 10765 Doves and bombs
- HDU - 3594 Cactus
- POJ - 1523 SPF
- UVALive 5903 Piece it together
- ZOJ - 3195 Design the city
- HDU Traffic Real Time Query System
- LCA问题的ST,tarjan离线算法解法
- CodeForces - 7D Palindrome Degree
- CodeChef A
- ajax 获取文件流 的另类解决办法
- UVA 11090 Going in Cycle!!
- UVALive - 3401 Colored Cubes