一个很简单的bfs。不知道为什么poj上过的人很少。。。
/* * Author: stormdpzh * Created Time: 2012/7/22 22:44:36 * File Name: poj_2023.cpp */ #include <iostream> #include <cstdio> #include <sstream> #include <cstring> #include <string> #include <cmath> #include <vector> #include <queue> #include <stack> #include <map> #include <set> #include <algorithm> #include <functional> #define sz(v) ((int)(v).size()) #define rep(i, n) for(int i = 0; i < n; i++) #define repf(i, a, b) for(int i = a; i <= b; i++) #define repd(i, a, b) for(int i = a; i >= b; i--) #define out(n) printf("%d\n", n) #define mset(a, b) memset(a, b, sizeof(a)) #define wh(n) while(1 == scanf("%d", &n)) #define whz(n) while(1 == scanf("%d", &n) && n != 0) #define lint long long using namespace std; const int MaxN = 105; struct text { char type; string txt; int a, b; string end; } page[MaxN]; int n; bool vis[MaxN]; int pre[MaxN]; void init() { repf(i, 1, n) { while(scanf("%c", &page[i].type) && (page[i].type == ' ' || page[i].type == '\n')); string tmp; page[i].txt = ""; while(cin >> tmp) { page[i].txt += tmp; page[i].txt += ' '; if(tmp[sz(tmp) - 1] == '"') { break; } } if(page[i].type == 'C') scanf("%d%d", &page[i].a, &page[i].b); else if(page[i].type == 'E') cin >> page[i].end; } } int gao() { queue<int> que; mset(vis, false); que.push(1); mset(pre, -1); while(!que.empty()) { int tmp = que.front(); que.pop(); if(page[tmp].type == 'E') { if(page[tmp].end == "HAPPY") return tmp; } else { if(!vis[page[tmp].a]) { que.push(page[tmp].a); pre[page[tmp].a] = tmp; vis[page[tmp].a] = true; } if(!vis[page[tmp].b]) { que.push(page[tmp].b); pre[page[tmp].b] = tmp; vis[page[tmp].b] = true; } } } } int main() { int t; int ans = 1; wh(t) { while(t--) { scanf("%d", &n); init(); int res = gao(); printf("STORY %d\n", ans++); stack<int> stk; while(res != -1) { stk.push(res); res = pre[res]; } while(!stk.empty()) { int tmp = stk.top(); stk.pop(); repf(i, 1, sz(page[tmp].txt) - 3) printf("%c", page[tmp].txt[i]); printf("\n"); } } } return 0; }