【转】POJ1130 Alien Security:DFS+BFS
总结:
①在读取数据处理空行上将房子之间的关系当做字符串输入当读入到一个字符串其内容为空时即空行停止输入。
从字符串中读取数据时用sscanf()即可 。
②广度优先搜索各个房间到ET房间的最短距离 。
③深度优先搜索枚举每个房间如果搜索不到ET房间则为并经之路 并更新距离ET房间最近的房间 。
#include<iostream> #include<queue> #include<cstdio> #include<cstring> using namespace std; const int MaxN=100; int n, et; // 房间数目 ET所在房间 bool used[MaxN]; // 标记已经搜索过的房间 bool data[MaxN][MaxN]; // 研究机构的邻接矩阵 int dis[MaxN]; // 其他房间到ET房间的距离 void shortest() { queue<int>q; q.push(et); dis[et]=0; while(!q.empty()) { int t=q.front(); q.pop(); for(int i=0; i<n; ++i) if(data[i][t] && dis[t]+1<dis[i]){ q.push(i); dis[i]=dis[t]+1; } } } int dfs(int id) { if(id==et) return 1; used[id]=1; for(int i=0; i<n; i++) if(!used[i] && data[id][i]) if(dfs(i)) return 1; return 0; } int main() { scanf("%d%d\n", &n, &et); memset(data, 0, sizeof(data)); for(int i=0; i<MaxN; i++) dis[i] = 1e10; char line[10]; int a, b; while(gets(line)) { if(strcmp(line, "")==0) break; sscanf(line, "%d%d", &a, &b); data[a][b]=true; } shortest(); int d=dis[0]; int room; for(int i=1; i<n; i++) { if(i==et) continue; memset(used, 0, sizeof(used)); used[i]=1; if(!dfs(0) && dis[i]<d) { d=dis[i]; room=i; } } cout<<"Put guards in room "<<room<<"."<<endl; return 0; }