图的BFS - HDU 1241/HDU 2612/POJ 3984

来源:互联网 发布:挂号用什么软件 编辑:程序博客网 时间:2024/06/05 17:06

这完全是回顾以前的知识了...写的时候一些似曾相识的手法渐渐冒出来........- -

然后其实题目都很水....但是看在我WA到现在的份上...贴出来....


HDU 1241

#include<cstdio>#include<cstring>#include<iostream>#include<cmath>#include<string>#include<vector>#include<map>#include<algorithm>using namespace std;inline int Rint() { int x; scanf("%d", &x); return x; }inline int max(int x, int y) { return (x>y)? x: y; }inline int min(int x, int y) { return (x<y)? x: y; }#define FOR(i, a, b) for(int i=(a); i<=(b); i++)#define FORD(i,a,b) for(int i=(a);i>=(b);i--)#define REP(x) for(int i=0; i<(x); i++)typedef long long int64;#define INF (1<<30)#define bug(s) cout<<#s<<"="<<s<<" "#define MAXN 102int G[MAXN*MAXN];// (x, y) => x+y*mint dx[] = { -1, 0, 1, 0, 1, 1, -1, -1};int dy[] = { 0, 1, 0, -1, 1, -1, 1, -1};int vis[MAXN*MAXN];int q[MAXN*MAXN];int front, tail;int n, m;void bfs(int st){//memset(q, 0, sizeof(q));front = tail = 0;q[tail++] = st;while(front<tail){int cur = q[front++];int x = cur%MAXN;int y = cur/MAXN;REP(8){int tx = x+dx[i];int ty = y+dy[i];int now = tx+ty*MAXN;if(G[now] == -1 || G[now] == 1 || vis[now])continue;vis[now] = 1;q[tail++] = now;}}}int main(){while(m = Rint()){int ans = 0;n = Rint();if(m == 0) break;memset(G, -1, sizeof(G));memset(vis, 0, sizeof(vis));FOR(i, 1, m)//rows{char buf[MAXN];scanf("%s", buf);FOR(j, 1, n){G[j+MAXN*i] = buf[j-1]=='*'? 1: 0;int va = j+MAXN*i;//bug(va);//bug(G[va])<<endl;}}FOR(i, 1, m)//rowsFOR(j, 1, n){int cur = j+i*MAXN;//bug(cur);//bug(G[cur])<<endl;if(!G[cur] && !vis[cur]){vis[cur] = 1;bfs(cur);ans++;}}printf("%d\n", ans);}}

HDU 2612

晚上真是不能刷太多题, 脑子昏....这题WA到死啊WA到死....

先是放结果(KFC)的数组开小了, 以为只有MAXN, 其实kfc能开遍全图....所以应该是MAXN*MAXN....这RE我都看了半天....

然后是结果数组应该要初始化为INF才行....还是WA...

最后发现'Y' 'M'也是可以走的, 其实就 # 不能走而已.....其实想的时候是对的...写的时候傻逼了下前后弄反了就.....shoot......

代码:

#include<cstdio>#include<cstring>#include<iostream>#include<cmath>#include<string>#include<vector>#include<map>#include<algorithm>using namespace std;inline int Rint() { int x; scanf("%d", &x); return x; }inline int max(int x, int y) { return (x>y)? x: y; }inline int min(int x, int y) { return (x<y)? x: y; }#define FOR(i, a, b) for(int i=(a); i<=(b); i++)#define FORD(i,a,b) for(int i=(a);i>=(b);i--)#define REP(x) for(int i=0; i<(x); i++)typedef long long int64;#define INF (0xffffff)#define bug(s) cout<<#s<<"="<<s<<" "#define MAXN 210int G[MAXN*MAXN];// (x, y) => x+y*mint dx[] = { -1, 0, 1, 0};int dy[] = { 0, 1, 0, -1};int vis[MAXN*MAXN];int fa[MAXN*MAXN];int q[MAXN*MAXN];int front, tail;int n, m;int s[2];//int ret[2][MAXN+3+1000000];int ret[2][MAXN*MAXN];int idx;//kfcint cal(int cur){if(fa[cur]!=cur)return cal(fa[cur])+1;return 0;}void bfs(int st, int id){fa[st] = st;front = tail = 0;q[tail++] = st;while(front<tail){int cur = q[front++];int x = cur%MAXN;int y = cur/MAXN;REP(4){int tx = x+dx[i];int ty = y+dy[i];int now = tx+ty*MAXN;if(G[now] == -1 || vis[now])continue;if(G[now]>0)//kfc{ret[id][G[now]] = cal(cur)+1;//kfc 可以通过么?//continue;}vis[now] = 1;fa[now] = cur;q[tail++] = now;}}}int main(){while(scanf("%d%d", &n, &m) == 2){idx = 0;//kfcint si = 0;memset(G, -1, sizeof(G));FOR(i, 1, n)//rows{char buf[MAXN];scanf("%s", buf);FOR(j, 1, m){char t = buf[j-1];int val = j+MAXN*i;if(t == 'Y' || t == 'M')s[si++] = val;if(t == '@')//>1,kfc{G[val] = ++idx;}else//G[val] = t=='.'? 0: -1;//只有#是不能走的....'Y' 'M'也是可以走的....WA到死......②G[val] = t=='#'? -1: 0;}}//不一定每个kfc都能让两人可以到达....所以ret要初始化...导致wa.....到死....①FOR(j, 1, idx){REP(2){ret[i][j] = INF;//实测把这段去掉也可以A....数据弱?}}REP(2){memset(vis, 0, sizeof(vis));vis[s[i]] = 1;bfs(s[i], i);}int minx = INF;FOR(i, 1, idx){//bug(i);//bug(ret[0][i])<<endl;minx = min(ret[0][i]+ret[1][i], minx);}printf("%d\n", 11*minx);}}

POJ 3984

#include<cstdio>#include<cstring>#include<iostream>#include<cmath>#include<string>#include<vector>#include<map>#include<algorithm>using namespace std;inline int Rint() { int x; scanf("%d", &x); return x; }inline int max(int x, int y) { return (x>y)? x: y; }inline int min(int x, int y) { return (x<y)? x: y; }#define FOR(i, a, b) for(int i=(a); i<=(b); i++)#define FORD(i,a,b) for(int i=(a);i>=(b);i--)#define REP(x) for(int i=0; i<(x); i++)typedef long long int64;#define INF (1<<30)#define bug(s) cout<<#s<<"="<<s<<" "#define MAXN 8int G[MAXN*MAXN];// (x, y) => x+y*mint dx[] = { -1, 0, 1, 0};int dy[] = { 0, 1, 0, -1};//int vis[MAXN][MAXN];int fa[MAXN*MAXN];int q[MAXN*MAXN];int front, tail;int m = MAXN;void print(int x, int y){if(x != 1 || y != 1){int cur = x+y*m;int now = fa[cur];int tx = now%m;int ty = now/m;print(tx, ty);}printf("(%d, %d)\n", x-1, y-1);}void bfs(int st){memset(q, 0, sizeof(q));memset(fa, 0, sizeof(fa));front = tail = 0;q[tail++] = st;while(1){int cur = q[front++];int x = cur%m;int y = cur/m;if(x == 5 && y == 5){print(x, y);return;}REP(4){int tx = x+dx[i];int ty = y+dy[i];int now = tx+ty*m;if(G[now] == -1 || G[now] == 1 || fa[now])continue;fa[now] = cur;q[tail++] = now;}}}int main(){memset(G, -1, sizeof(G));FOR(i, 1, 5)FOR(j, 1, 5){G[i+m*j] = Rint();}bfs(1+1*m);}


原创粉丝点击