/*<br />逼著自己去寫鄰接表,xwc給我講過大致如何構造,聽其實還是簡單的。可是寫起來稍微有點困難的<br />光是建表就很糾結的,指標數組 和 數組 總是不能區別開來,最初很痛苦寫好的,編譯沒有通過,<br />把這兩個東西混起來,對於指標就是有一種莫名的不知道。很早xwc就鼓勵我去寫了,但是一直害怕麻煩就不敢嘗試,<br />這是一個不好的毛病,為了不能讓cdd 的苦心白費,我決定要學會鄰接表</p><p>其實這道題目我很早就寫了,當時MLE,就不知道怎麼改,今天一開始用鄰接寫的也是同樣的毛病<br />真不知怎麼去改,xwc說肯定哪裡有小錯誤,於是很興奮地想把這紙老虎找出來,於是想到了距離為1的最短路的BFS<br />每次更新就是最短路,可以直接hash,不用彈出一個一個hash的,這應該是MLE的關鍵所在,修改了下,終於AC<br />對於樹的BFS總是有點困惑的,當經過今天,我想大概明白了點什麼,我只要在認真地學,肯定能學到東西的!<br />*/</p><p>#include <iostream><br />#include <cstring><br />#include <cstdio><br />#include <queue><br />using namespace std;</p><p>const int N = 10000;<br />const int INF = 0x7f7f7f7f;<br />struct node<br />{<br />int mu;<br />struct node *next;<br />};<br />node *map[N], ved[N];//這裡怎麼去用,開始的時候還是不知如何,數組是要用 ved[9].mu 的,不是用ved[9]->mu,zhc幫我改的<br />bool hash[N];<br />bool flag[N];<br />int dis[N];<br />int Dis[N];</p><p>void show()<br />{<br />for(int i = 0; i < N; i++)<br />{<br />map[i] = & ved[i];<br />}<br />}<br />void ctreat(int x, int y, int val)<br />{//建立鄰接表<br />node *p;<br />p = new node;<br />p->mu = y;<br />p->next = NULL;<br />map[x] ->next = p;<br />map[x] = p;<br />}<br />struct Node<br />{<br />int dis;<br />int num;<br />};<br />void BFS(int s)<br />{<br />queue<Node> Q;<br />Node P, M;<br />memset(dis, 0x7f, sizeof(dis));<br />memset(hash, false, sizeof(hash));<br />map[s] = &ved[s];<br />for( node *p = map[s]->next; p != NULL; p = p ->next)<br />{<br />P.num = p->mu;<br />P.dis = 1;<br />dis[p->mu] = 1;<br />hash[p->mu] = true;<br />Q.push(P);<br />}<br />hash[s] = true;<br />while(!Q.empty())<br />{<br />M = Q.front();<br />Q.pop();<br />//hash[M.num] = true;//只這裡hash的會MLE,看來是priority_queue 寫逛了<br />dis[M.num] = M.dis;<br />if(dis[M.num] > Dis[M.num])<br />Dis[M.num] = dis[M.num];<br />map[M.num] = & ved[M.num];<br />for(node *p = map[M.num]->next; p != NULL; p = p->next)<br />{</p><p>if(!hash[p->mu])<br />{<br />P.num = p->mu;<br />P.dis = M.dis + 1;<br />dis[p->mu] = P.dis;<br />hash[p->mu] = true;<br />Q.push(P);<br />}<br />}<br />}<br />//free(p);</p><p>}<br />int main()<br />{<br />int t;<br />scanf("%d", &t);<br />while(t--)<br />{<br />int nz, nr;<br />int v, r, y;<br />int st = INF, et = -INF;<br />memset(flag, false, sizeof(flag));<br />scanf("%d %d", &nz, &nr);<br />show();<br />for(int i = 0; i < nz; i++)<br />{</p><p>scanf("%d %d", &v, &r);<br />flag[v] = true;<br />if(v < st)<br />{<br />st = v;<br />}<br />if(v > et)<br />{<br />et = v;<br />}<br />for(int j = 0; j < r; j++)<br />{<br />scanf("%d", &y);<br />flag[y] = true;<br />if(y < st)<br />{<br />st = y;<br />}<br />if(y > et)<br />{<br />et = y;<br />}<br />ctreat(v, y, 1);<br />}</p><p>}<br />memset(Dis, 0, sizeof(Dis));</p><p>while(nr--)<br />{<br />scanf("%d", &r);<br />for(int i = 0; i < r; i++)<br />{<br />scanf("%d", &y);<br />BFS(y);<br />}<br />}<br />int df = INF;<br />int bb;<br />for(int i = st; i <= et; i++)<br />{<br />if(Dis[i] < df && flag[i])<br />{<br />df = Dis[i];<br />bb = i;<br />}<br />}<br />printf("%d %d/n", df + 1, bb);</p><p>}<br />return 0;<br />}
/*<br />AC之後順便把以前的寫的也改,以前用的是類似於鄰接表的靜態鄰接表<br />*/</p><p>#include <iostream>//2223317 2010-07-12 18:02:22 Accepted 2913 C++ 270 752 悔惜晟<br />#include <queue><br />#include <cstdio><br />using namespace std;</p><p>const int N = 10000;<br />const int INF = 0x7f7f7f7f;<br />int cost[N][12];<br />bool hash[N];<br />bool flag[N];<br />int dis[N];<br />int Dis[N];</p><p>struct node<br />{<br />int dis;<br />int x;<br />};<br />void BFS(int st,int en, int s)<br />{<br />queue<node>Q;<br />node P, M;<br />memset(dis, 0x7f, sizeof(dis));<br />memset(hash, false, sizeof(hash));</p><p>for(int i = 1; i <= 10; i++)<br />{<br />if(cost[s][i] != 0)<br />{<br />dis[cost[s][i]] = 1;<br />hash[cost[s][i]] = true;<br />P.dis = 1;<br />P.x= cost[s][i];<br />Q.push(P);<br />}<br />}<br />hash[s] = true;<br />while(!Q.empty())<br />{<br />P = Q.front();<br />Q.pop();<br />if(dis[P.x] > Dis[P.x])<br />Dis[P.x] = dis[P.x];</p><p>for(int i = 1; i <= 10; i++)<br />{<br />if(!hash[cost[P.x][i]] && cost[P.x][i] != 0)<br />{<br />dis[cost[P.x][i]] = P.dis + 1;<br />hash[cost[P.x][i]] = true;<br />M.dis = P.dis + 1;<br />M.x = cost[P.x][i];<br />Q.push(M);<br />}<br />}<br />}<br />}<br />int main()<br />{<br />int t;<br />scanf("%d", &t);<br />while(t--)<br />{<br />int z, r;<br />memset(cost, 0, sizeof(cost));<br />memset(Dis, 0, sizeof(Dis));<br />memset(flag, false, sizeof(flag));<br />scanf("%d %d", &z, &r);<br />int a, b, c;<br />int st, en;<br />st = INF;<br />en = -INF;<br />while(z--)<br />{<br />scanf("%d %d", &a, &b);<br />flag[a] = true;<br />if(a > en)<br />en = a;<br />if(a < st)<br />st = a;<br />cost[a][0] = a;<br />for(int i = 1; i <= b; i++)<br />{<br />scanf("%d", &c);<br />flag[c] = true;<br />if(c > en)<br />en = c;<br />if(c < st)<br />st = c;<br />cost[a][i] = c;<br />}<br />}<br />int bb;<br />while(r--)<br />{<br />scanf("%d", &a);<br />while (a--)<br />{<br />scanf("%d", &bb);<br />BFS(st, en, bb);<br />}<br />}<br />a = INF;<br />for(int i = st; i <= en; i++)<br />{</p><p>if(Dis[i] < a && flag[i])<br />{<br />a = Dis[i];<br />b = i;<br />}<br />}<br />printf("%d %d/n", a + 1, b);<br />}<br />}