锘??xml version="1.0" encoding="utf-8" standalone="yes"?> 鍐滃ぇ灝辨槸鎶犻棬錛?/p>
姣旇禌寮濮嬪墠錛岀珶鐒舵墦鍗版満涓嶈兘鎵撳嵃錛屽歡榪熷崐灝忔椂鎵嶅紕濂斤紒 姣旇禌鍓嶏紝绔熺劧娌℃湁鍙戞按錛佺珶鐒惰錛?#8220;娌℃湁姘寸殑鑷繁鍘繪嬁錛?#8221;銆傛劅鎯呮槸瑕佹垜浠嚜宸卞幓涔版按錛屽埆鎷夸粬浠殑錛佸幓鎷跨殑錛屾瘡涓槦涔熷彧鏈変竴鐡?50ml鐨勫▋鍝堝搱錛屼竴涓槦3涓漢錛岃鏄竴涓槦鏈夌敺鏈夊コ錛屽搱鍝?#8230;…榪欎釜澶у閮界煡閬擄紝灝變笉璇翠簡錛?/p>
騫稿ソ鎴戜滑鑷繁涔頒簡鍙箰錛?/p>
9:30姣旇禌寮濮嬶紒 姣旇禌寮濮嬪嚑鍒嗛挓浜嗭紝绔熺劧榪樹笉鍙戠焊璐ㄩ鐩紒闂彁浜ょ綉绔欐槸浠涔堬紝绔熺劧璇村彧鏈夌焊璐ㄧ殑棰樼洰錛屾病鏈夌綉绔欙紒 鏃╀笂7鐐瑰悆浜嗕釜闈㈠寘錛屼竴孌墊椂闂翠笅鏉ワ紝楗跨殑涓嶈浜嗐傜粓浜庡埌絳夊埌涓崍浜嗭紝蹇楁効鑰呮嬁鏉ヤ簡鍗堥錛屾墦寮涓鐪嬫垜灝變笉楗夸簡錛?/p>
涓涓鏂欒閲屽ご瑁呬簡7涓鐗╋紒涓ょ闈㈠寘錛屽姞璧鋒潵3涓紱涓涓浮铔嬶紱涓ゆ牴涓鍧楅挶鍙互涔頒袱鏍圭殑閭g鐏吙錛涗竴鏍歸钑夛紱涓鐡?50ml鐨勫▋鍝堝搱錛涗竴灝忕摱閰稿ザ錛岀珶鐒舵病鏈夊惛綆★紙鎷垮洖鏉ヤ箣鍚庯紝濂戒笉瀹規槗鎵撳紑錛屼竴闂伙紝绔熺劧涓鑲℃兂鍛曞悙鐨勬劅瑙夋秾涓婁簡蹇冨ご錛屽嚑澶╀笉鏁㈠枬閰稿ザ錛夛紱鎰熸儏鍐滃ぇ涓崍鍚冪殑閮芥槸闈㈠寘錛熷悆绱犵殑錛?/p>
鏈濂界殑灝辨槸鏈?縐嶉鐗╋紒7縐嶉鐗╁姞璧鋒潵娌℃湁椋熷爞鍚冧竴嬈¢キ璐碉紒濡傛灉姣忓ぉ鍚冨崍槨愰兘榪欎箞渚垮疁錛屾劅鎯呭氨涓嶈鍘昏繍鍔ㄤ簡錛屼繚鍑嗗噺鑲ワ紒 5涓皬鏃惰繃鍘諱簡錛屾瘮璧涚粓浜庡畬浜嗐傚張榪囦簡2涓皬鏃訛紝闂箷寮忕粓浜庡畬浜嗐傝刀绱ц窇鍘誨悆楗紝閭i噷鏁欑粌鏃╁凡璁㈠ソ浜嗛キ錛岀偣濂戒簡鑿滐紒 鍧愬湪杞︿笂銆傞粯榛樺湴鍥炲ご鐪嬩簡涓鐪煎啘澶э紒娓愯娓愯繙…… Description Input Output Sample Input Sample Output
鑷充簬bfs鐨勫仛娉曞涓嬶細
1錛屽紑濮嬬偣榪涙爤
2錛屽紑濮嬬偣鑳界洿鎺ュ埌杈?涓嶈姳鏃墮棿鐨?鐨勬墍鏈夌殑鐐硅繘鏍?br /> 3錛屽垎涓ゆ
3.1 寮濮嬬偣涓嶈兘鐩存帴鍒拌揪錛堣鏃墮棿錛夌殑鐐硅繘鏍?br /> 3.2 灝嗚繖涓偣鑳界洿鎺ュ埌杈?涓嶈姳鏃墮棿鐨?鐨勬墍鏈夌殑鐐硅繘鏍?br /> 3.3 璺寵漿鍒?
4 璺寵漿鍒?
娉細寮濮嬬偣涓哄綋鍓嶅嚭鏍堢殑絎竴涓偣
涓嶆槑鐧借繖涓繃紼嬬殑鍙互鐪嬩唬鐮侊紙铏界劧浠g爜鏈夌偣……錛岃繕鍙互榪涗竴姝ョ畝鍖栵紝 浠ュ悗涓嶈兘鑰佹兂鐫浼樺厛浜嗭紝璋佷紭鍏堣皝鏉叿錛屽綋鐒朵笉鏄鎴戜滑鐨勫箍澶уコ鍚岃優……錛?br />
2 #include <queue>
3 using namespace std;
4 struct node
5 {
6 int x, y, time;
7 /*friend bool operator < (node a, node b)
8 {
9 return a.time > b.time;
10 }*/
11 };
12 int n, m;
13 int xi[8] = {-1, -1, 0, 1, 1, 1, 0, -1};
14 int yi[8] = {0, 1, 1, 1, 0, -1, -1, -1};
15 char map[1005][1005];
16 bool vist[1005][1005];
17 bool check(int dx, int dy)
18 {
19 if (dx >= 0 && dy >=0 && dx < n && dy < m) return true;
20 return false;
21 }
22 queue <node> q;
23 int bfs(node now, node end)
24 {
25 while (!q.empty())q.pop();
26 now.time = 0;
27 q.push(now);
28
29 for (int i = 0; i < n; i++)
30 for (int j = 0; j < m; j++)
31 vist[i][j] = false;
32 vist[now.x][now.y] = true;
33 node next, tmp;
34 bool flag = false;
35 while (!q.empty())
36 {
37 now = q.front();
38 tmp = now;
39 if (now.x == end.x && now.y == end.y) return now.time;
40 q.pop();
41 flag = false;
42 while (1)
43 {
44 next.x = tmp.x + xi[map[tmp.x][tmp.y]-'0'];
45 next.y = tmp.y + yi[map[tmp.x][tmp.y]-'0'];
46 if (check(next.x, next.y) && !vist[next.x][next.y])
47 {
48 if (next.x == end.x && next.y == end.y) return tmp.time;
49 next.time = tmp.time;
50 vist[next.x][next.y] = true;
51 q.push(next);
52 tmp = next;
53 }else break;
54 }
55 for (int i = 0; i < 8; i++)
56 {
57 next.x = now.x + xi[i];
58 next.y = now.y + yi[i];
59 if (check(next.x, next.y) && !vist[next.x][next.y])
60 {
61 if (map[now.x][now.y] - '0' == i) next.time = now.time;
62 else next.time = now.time + 1;
63 if (next.x == end.x && next.y == end.y) return next.time;
64 vist[next.x][next.y] = true;
65 q.push(next);
66 tmp = next;
67 while (1)
68 {
69 next.x = tmp.x + xi[map[tmp.x][tmp.y]-'0'];
70 next.y = tmp.y + yi[map[tmp.x][tmp.y]-'0'];
71 if (check(next.x, next.y) && !vist[next.x][next.y])
72 {
73 if (next.x == end.x && next.y == end.y) return tmp.time;
74 next.time = tmp.time;
75 vist[next.x][next.y] = true;
76 q.push(next);
77 tmp = next;
78 }else break;
79 }
80 }
81 }
82 }
83 return 0;
84 }
85 int main()
86 {
87 while (scanf("%d%d", &n, &m) != EOF)
88 {
89 int i, j;
90 for (i = 0; i < n; i++)
91 scanf("%s", map[i]);
92 int T;
93 scanf("%d", &T);
94 node now, end;
95 for (i = 0; i < T; i++)
96 {
97 scanf("%d%d%d%d", &now.x, &now.y, &end.x, &end.y);
98 now.time = 0;
99 now.x --;
100 now.y --;
101 end.x --;
102 end.y --;
103 if (now.x == end.x && now.y == end.y)
104 {
105 printf("0\n");
106 }else printf("%d\n", bfs(now, end));
107 }
108 }
109 return 0;
110 }
111
]]>
鍏蜂綋鐪嬩唬鐮侊紝涓嶅仛榪囧鐨勮В閲娿?
2 #include <queue>
3 using namespace std;
4 struct node
5 {
6 int x, y;
7 int step, dir;
8 };
9 int n, m;
10 int xi[4] = {0, 1, -1, 0};
11 int yi[4] = {1, 0, 0, -1};
12 int vist[82][82][4];
13 char map[82][82];
14 node start;
15 queue <node> q;
16 bool check(int dx, int dy)
17 {
18 if(dx >= 1 && dx <= n && dy >= 1 && dy <= m) return true;
19 else return false;
20 }
21 bool find(node a)
22 {
23 if ((a.x == 1 || a.x == n || a.y == 1 || a.y == m)) return true;
24 else return false;
25 }
26 int bfs()
27 {
28 while (!q.empty())q.pop();
29 memset(vist, 0, sizeof(vist));
30 start.dir = -1;
31 start.step = 0;
32 q.push(start);
33 node now, next;
34 bool flag = true;
35 int tmp;
36 while (!q.empty())
37 {
38 now = q.front();
39 q.pop();
40 if (find(now)) return now.step;
41
42 flag = false;
43 for (int i = 0 ; i < 4; i++)
44 {
45 if (now.dir == i) continue;
46 if (now.dir >=0 && 3-now.dir == i) continue;
47 next.x = now.x + xi[i];
48 next.y = now.y + yi[i];
49 next.step = now.step + 1;
50 if (check(next.x, next.y) && map[next.x][next.y] == '.' )
51 {
52 if (vist[next.x][next.y][i] == 0)
53 {
54 vist[next.x][next.y][i] = next.step;
55 next.dir = i;
56 q.push(next);
57 }
58 else if (vist[next.x][next.y][i] > next.step)
59 {
60 vist[next.x][next.y][i] = next.step;
61 next.dir = i;
62 q.push(next);
63 }
64 flag = true;
65 }
66 }
67 if (!flag)
68 {
69 int i = now.dir;
70 if (i < 0) return 0;
71 next.x = now.x + xi[i];
72 next.y = now.y + yi[i];
73 next.step = now.step + 1;
74 if (check(next.x, next.y) && map[next.x][next.y] == '.' )
75 {
76 if (vist[next.x][next.y][i] == 0)
77 {
78 vist[next.x][next.y][i] = next.step;
79 next.dir = i;
80 q.push(next);
81 }
82 else if (vist[next.x][next.y][i] > next.step)
83 {
84 vist[next.x][next.y][i] = next.step;
85 next.dir = i;
86 q.push(next);
87 }
88 flag = true;
89 }
90 }
91 }
92 return -1;
93 }
94 int main()
95 {
96 int cas;
97 scanf("%d", &cas);
98 while (cas--)
99 {
100 scanf("%d%d", &n, &m);
101 int i, j;
102 for (i = 1; i <= n; i++)
103 scanf("%s", map[i]+1);
104 for (i = 1; i <= n; i++)
105 for (j = 1; j <= m; j++)
106 {
107 if (map[i][j] == '@')
108 {
109 start.x = i;
110 start.y = j;
111 map[i][j] = '.';
112 }
113 }
114 int ans = bfs();
115 printf("%d\n", ans);
116 }
117 return 0;
118 }
119
]]>
濡傛灉鑳藉鍒拌揪錛屽垯姹傚嚭瀵逛簬姣忎竴涓偣鍒板叾浠栨墍鏈夌殑鐐規渶鐭窛紱諱箣鍜岋紝灝嗚繖浜涘拰鐩稿姞灝辨槸鏈鍚庣殑緇撴灉
瑙i鎬濊礬錛?br /> 瀵規瘡涓涓偣姹備竴嬈″崟婧愭渶鐭礬錛岀劧鍚庢眰鍜岋紝鐩稿姞鐨勫埌鏈鍚庣殑緇撴灉……
浣嗭紝綆椾竴涓嬫椂闂村鏉傚害錛?澶嶆潅搴︽槸O(M*N*M)銆傜敱浜嶮*N*M=3000*100*3000=9*108錛屼笉鍙兘AC
鎵浠ワ紝闇瑕佹垜浠彟杈熶粬寰勩傜綉涓婃湁璇村緩浠涔堟渶鐭礬寰勬爲錛岃繖涓垜涓嶆噦……
鎴戠殑鎬濊礬鏄細寮曠敤鍓嶉潰鐨勬濊礬錛屽姣忎竴涓偣姹備竴嬈℃渶鐭礬錛屽茍灝嗗叾姹傚拰錛屼繚瀛樺湪涓涓暟緇勯噷澶達紝瀹氫負sum[i]錛宨琛ㄧず鐫涓涓偣鍒版墍鏈夊叾浠栫偣鏈鐭礬涔嬪拰銆傚茍灝嗚繖浜涘拰鐩稿姞 ans = sum[1] + …… + sum[n];
鐒跺悗錛屽垹闄や竴鏉¤竟錛屽叾欏剁偣鏆傚畾涓簎,v錛屽榪欐潯杈圭殑涓涓《鐐箄鍦ㄤ竴嬈℃眰鏈鐭礬錛屽鏋滆繖涓偣錛屼笉鑳藉埌杈捐繖鏉¤竟鐨勫彟涓涓偣v錛屽垯 鐩存帴杈撳嚭INF
濡傛灉錛岃兘澶熷埌杈撅紝鍒欏v涔熸眰涓嬈℃渶鐭礬錛屽浜巙錛寁涓ょ偣鏉ヨ錛屾眰寰梪鍒版瘡涓涓偣鐨勬渶鐭礬涔嬪拰sum_u錛屾眰寰梫鍒版瘡涓涓偣鐨勬渶鐭礬涔嬪拰sum_v錛?br /> 鏈鍚庣粨鏋滀負錛?ans = ans + sum_u + sum_v - sum[u] - sum[v];
ans涓烘渶鍚庣瓟妗堬紙鍗冧竾璁頒綇鏄瘡涓緇勭殑錛屽洜涓烘湁m鏉¤竟錛?br /> 鍏蜂綋鐪嬩唬鐮侊細
http://acm.hdu.edu.cn/showproblem.php?pid=2433
鏃墮棿鏄?953ms
2 #include <queue>
3 using namespace std;
4 const int SIZE = 102;
5 const int INF = 1 << 30;
6 struct node
7 {
8 int v, w, next;
9 }map[SIZE * SIZE];
10
11 int head[SIZE], use;
12 int num[SIZE * 30];
13 int sum[SIZE];
14
15 void add(int u, int v, int w)
16 {
17 map[use].v = v;
18 map[use].w = w;
19 map[use].next = head[u];
20 head[u] = use ++;
21 }
22 void init()
23 {
24 use = 0;
25 memset(head, -1, sizeof(head));
26 memset(sum, 0, sizeof(sum));
27 }
28
29 queue <int> q;
30 bool vist[SIZE];
31 int dis[SIZE];
32
33 int spfa(int s)
34 {
35 while (!q.empty()) q.pop();
36
37 for (int i = 0; i < SIZE ; i ++) dis[i] = INF;
38
39 memset(vist, false, sizeof(vist));
40 dis[s] = 0;
41 vist[s] = true;
42 q.push(s);
43 int ans = 0;
44 while (!q.empty())
45 {
46 int u = q.front();
47 q.pop();
48 vist[u] = false;
49 ans += dis[u];
50 for (int i = head[u]; i != -1; i = map[i].next)
51 {
52 int v = map[i].v;
53 if (dis[v] > dis[u] + map[i].w)
54 {
55 dis[v] = dis[u] + map[i].w;
56 if (!vist[v])
57 {
58 vist[v] = true;
59 q.push(v);
60 }
61 }
62 }
63 }
64 return ans;
65 }
66 int main()
67 {
68 int n, m;
69 while (scanf("%d%d", &n, &m) != EOF)
70 {
71 int i, j, k;
72 int u, v;
73 init();
74 memset(num, 0, sizeof(num));
75 for (i = 1; i <= m; i++)
76 {
77 scanf("%d%d", &u, &v);
78 num[i] = use;
79 add(u, v, 1);
80 add(v, u, 1);
81 }
82 int ans = 0;
83 for (i = 1; i <= n; i++)
84 {
85 sum[i] = spfa(i);
86 ans += sum[i];
87 }
88 int tmp = ans;
89 for (i = 1; i <= m; i++)
90 {
91 map[num[i]].w = INF;
92 map[num[i]^1].w = INF;
93
94 ans = tmp;
95 ans += spfa(map[num[i]].v);
96
97 if (dis[map[num[i]^1].v] == INF)
98 {
99 printf("INF\n");
100 }
101 else
102 {
103 ans += spfa(map[num[i]^1].v);
104 ans = ans - sum[map[num[i]].v] - sum[map[num[i]^1].v];
105 printf("%d\n", ans);
106 }
107 map[num[i]].w = 1;
108 map[num[i]^1].w = 1;
109 }
110 }
111 return 0;
112 }
113
]]>
]]>
Your task is to compute the minimum amount of money you need to pay in order to send these n little men into those n different houses. The input is a map of the scenario, a '.' means an empty space, an 'H' represents a house on that point, and am 'm' indicates there is a little man on that point.
You can think of each point on the grid map as a quite large square, so it can hold n little men at the same time; also, it is okay if a little man steps on a grid with a house without entering that house.2 2
.m
H.
5 5
HH..m
.....
.....
.....
mm..H
7 8
...H....
...H....
...H....
mmmHmmmm
...H....
...H....
...H....
0 0
2
10
28
KM綆楁硶錛?
鍏跺疄榪欎釜棰樻眰鐨勬槸鏈灝忔潈鍖歸厤錛岋紝浣嗘湁浜涢鐩渶灝忎笉涓瀹氬ソ姹傦紝浜庢槸鎴戜滑鍙互鎹竴縐嶆濈淮錛屽皢鏈夋墍鐨勮窛紱誨彉鎴愯礋鐨勶紝閭d箞鎴戜滑瑕佹眰鐨勫氨鏄渶澶ф潈鍖歸厤錛侊紙鍦ㄤ竴浣嶅ぇ鐗涚殑鎸囩偣涓嬶級
搴熻瘽涓嶅璇達紝鐪嬬▼搴忥細
2 using namespace std;
3 #define Inf 10000000;
4 int map[105][105];
5 int slack[105];
6 int lx[105],ly[105];
7 bool x[105],y[105];
8 int link[105];
9 int n,m;
10 char mm[105][105];
11 bool dfs(int v)
12 {
13 x[v]=true;
14 int t;
15 for (int i=0;i<m;i++)
16 {
17 if (!y[i])
18 {
19 t=lx[v]+ly[i]-map[v][i];
20 if (t==0)
21 {
22 y[i]=true;
23 if (link[i]==-1||dfs(link[i]))
24 {
25 link[i]=v;
26 return true;
27 }
28 }
29 else slack[i]=min(slack[i],t);
30 }
31 }
32 return false;
33 }
34 void KM()
35 {
36 int i,j,k;
37 memset(link,-1,sizeof(link));
38 for (i=0;i<=m;i++)
39 {
40 lx[i]=-Inf;
41 ly[i]=0;
42 }
43 for (i=0;i<m;i++)
44 {
45 while (1)
46 {
47 memset(x,0,sizeof(x));
48 memset(y,0,sizeof(y));
49
50 for (j=0;j<m;j++) slack[j]=Inf;
51
52 if (dfs(i))break;
53
54 int d=Inf;
55 for (j=0;j<m;j++)
56 if (!y[j])d=min(slack[j],d);
57
58 for (j=0;j<m;j++)
59 {
60 if (x[j])lx[j]-=d;
61 if (y[j])ly[j]+=d;
62 }
63 for (j=0;j<m;j++)
64 if (!y[j])slack[j]-=d;
65 }
66 }
67 }
68 int main()
69 {
70 int i,j,k,t,l,v;
71 while (cin>>k>>t)
72 {
73 if (k+t==0)break;
74 for (i=1;i<=k;i++)
75 for (j=1;j<=t;j++)
76 scanf(" %c",&mm[i][j]);
77 memset(map,0,sizeof(map));
78 n=0,m=0;
79 for (i=1;i<=k;i++)
80 for (j=1;j<=t;j++)
81 {
82 if (mm[i][j]=='H')
83 {
84 n=0;
85 for (l=1;l<=k;l++)
86 for (v=1;v<=t;v++)
87 {
88 if (mm[l][v]=='m')
89 {
90 map[m][n]=-(abs(i-l)+abs(j-v));
91 n++;
92 }
93 }
94 m++;
95 }
96 }
97 KM();
98 int sum=0;
99 for (i=0;i<m;i++)
100 sum+=map[link[i]][i];
101 cout<<0-sum<<endl;
102 }
103 return 0;
104 }
105
106
]]>
]]>