USACO Section 4.3 Street Race - 简单搜索
来源:互联网 发布:淘宝店买家晒图福利 编辑:程序博客网 时间:2024/05/21 22:39
50个点...100条边....数据量很小...第一问就直接枚举去掉每个点看能否到达终点~~~N次BFS就ok了...
第二问~~首先第二问的点肯定是第一问的点的子集~~这个应该好想到..然后就按他的描述...枚举第一问得到的点..从起点开始BFS到枚举的这个点记录能到达的点..从枚举的这个点开始BFS到终点并记录所能到达的点...若两者标记的点中没有重复则说明这个第一问的点同时满足第二问的要求~
Program:
/* ID: zzyzzy12 LANG: C++ TASK: race3*/ #include<iostream> #include<istream> #include<stdio.h> #include<string.h> #include<math.h> #include<stack>#include<map>#include<algorithm> #include<queue> #define oo 1000000000 #define ll long long #define pi (atan(2)+atan(0.5))*2 using namespace std; struct node{ int x,y,next; }line[305];int n,m,_link[55],Ans1[55],Ans1Num;bool used[55];queue<int> myqueue;void getanswer1(){ int p=1,h,k; Ans1Num=0; for (p=1;p<n;p++) { while (!myqueue.empty()) myqueue.pop(); memset(used,false,sizeof(used)); used[p]=true; used[0]=true; myqueue.push(0); while (!myqueue.empty()) { h=myqueue.front(); myqueue.pop(); k=_link[h]; while (k) { if (!used[line[k].y]) { used[line[k].y]=true; myqueue.push(line[k].y); } k=line[k].next; } } if (!used[n]) Ans1[++Ans1Num]=p; } printf("%d",Ans1Num); for (p=1;p<=Ans1Num;p++) printf(" %d",Ans1[p]); printf("\n"); return;}void getanswer2(){ int Ans2Num,Ans2[55],p,h,k; bool f[55]; Ans2Num=0; for (p=1;p<=Ans1Num;p++) { while (!myqueue.empty()) myqueue.pop(); memset(f,false,sizeof(f)); f[Ans1[p]]=true; myqueue.push(Ans1[p]); while (!myqueue.empty()) { h=myqueue.front(); myqueue.pop(); k=_link[h]; while (k) { if (!f[line[k].y]) { f[line[k].y]=true; myqueue.push(line[k].y); } k=line[k].next; } } memset(used,false,sizeof(used)); used[0]=true; myqueue.push(0); while (!myqueue.empty()) { h=myqueue.front(); myqueue.pop(); if (h==Ans1[p]) continue; if (f[h]) goto A; k=_link[h]; while (k) { if (!used[line[k].y]) { used[line[k].y]=true; myqueue.push(line[k].y); } k=line[k].next; } } Ans2[++Ans2Num]=Ans1[p]; A: ; } printf("%d",Ans2Num); for (k=1;k<=Ans2Num;k++) printf(" %d",Ans2[k]); printf("\n"); return;}int main() { freopen("race3.in","r",stdin); freopen("race3.out","w",stdout); int i,y; m=0; n=-1; memset(_link,0,sizeof(_link)); while (1) { scanf("%d",&y); if (y==-1) break; n++; while (y!=-2) { m++; line[m].x=n; line[m].y=y; line[m].next=_link[n]; _link[n]=m; scanf("%d",&y); } } getanswer1(); getanswer2(); return 0; }
- USACO Section 4.3 Street Race - 简单搜索
- usaco 4.3 Street Race(搜索)
- Section 4.3 Street Race
- usaco 4.3 Street Race
- USACO 4.3 Street Race
- USACO-Section 4.3 Street Race (枚举&&BFS)
- usaco 4.3.4 Street Race
- usaco training 4.3.3 Street Race 题解
- usaco 4.3 Street Race 2010.8.7
- USACO Street Race 解题报告
- usaco street race(dfs)
- C++——【USACO 4.3.2】——Street Race
- Street Race
- USACO Section 4.3 Letter Game - 简单枚举
- USACO-Section 1.3 Wormholes[搜索]
- USACO Section 4.3 The Primes - 好恶心的搜索
- PKU1172 street race
- poj 1172 Street Race
- 热备份 数据库打开状态下非系统表空间损坏的恢复
- SVN
- 我的lan-free (第一篇)
- 关于项目算法的思考
- JAVA版PageRank查询代码
- USACO Section 4.3 Street Race - 简单搜索
- 我的lan-free (第二篇)
- 双通道内存的实践
- __attribute__
- 恢复windows7启动项
- Hibernate 常见异常处理(转帖)
- Python的函数参数传递:传值?引用?
- 集中决策和分散决策(3)
- 宝宝日记