244. [POI2000] 滑雪队
一个滑雪队在Byte山上组织了一次训练。山的北坡有一个滑雪场,所有的滑雪者都要从山上的起点站滑到山下的终点站。此次训练中各队员同时出发到终点站会合,除了始末两处外,队员们的滑雪路径不能相交,且山上的滑雪道只能从上往下滑。
滑雪道的分布地图由多块被林地连接的空地组成,每块空地都处于不同的高度。两块空地间至多由一块林地连接。滑雪过程中,滑雪者可以选择路径访问任一空地(但不必全部经过)。各滑雪道只在空地相会,既不穿隧道,也不临空飞越。
任务:
编写一个程序完成下列工作:
- 读入滑雪场的地图;
- 算出能参加训练的最大队员数;
- 把结果写入文件。
输入:
文件的第一行是空地的数目n,2≤n≤5000。以下n-1行,每行都有一些用空格分开的整数,第(i+1)行的数字描述的是从空地i沿林 地往下可到达的其它空地。该行第一个整数k表示这些空地的个数,以下k个整数即它们的编号,按从东到西的顺序排列(即通向各空地的林地的位置)。空地从1 到n编号。起点站建于空地1,终点站建于空地n。
输出:
仅一行,包括一个整数,即能参加训练的最大人数。
输入样例:
15 5 3 5 9 2 4 1 9 2 7 5 2 6 8 1 7 1 10 2 14 11 2 10 12 2 13 10 3 13 15 12 2 14 15 1 15 1 15 1 15
输出样例:
3
如下图
我看一眼,以为是网络流。。
结果发现 dfs就可以搞定 不需要那么麻烦 (实际上我并不知道网络流能不能做。。)
小小的贪心 每次我们都从东边开始走 标记为已走过
走不动再换路 记录走过的路径数 输出
1 #include <vector> 2 #include <cctype> 3 #include <cstdio> 4 5 const int MAXN=5010; 6 7 int n,ans; 8 9 bool vis[MAXN]; 10 11 std::vector<int> v[MAXN]; 12 13 inline void read(int&x) { 14 int f=1;register char c=getchar(); 15 for(x=0;!isdigit(c);c=='-'&&(f=-1),c=getchar()); 16 for(;isdigit(c);x=x*10+c-48,c=getchar()); 17 x=x*f; 18 } 19 20 inline bool pd() { 21 for(int i=0;i<v[1].size();++i) 22 if(!vis[v[1][i]]) return true; 23 return false; 24 } 25 26 void DFS(int u,bool&flag) { 27 if(u==n) {vis[u]=true;++ans;flag=true;return ;} 28 if(vis[u]&&u!=1) return; 29 vis[u]=true; 30 for(int i=0;i<v[u].size();++i) { 31 int to=v[u][i]; 32 DFS(to,flag); 33 if(flag) return; 34 } 35 return; 36 } 37 38 int hh() { 39 freopen("nar.in","r",stdin); 40 freopen("nar.out","w",stdout); 41 int len; 42 read(n); 43 for(int i=1;i<n;++i) { 44 read(len); 45 for(int x;len--;) { 46 read(x); 47 v[i].push_back(x); 48 } 49 } 50 bool flag; 51 while(pd()) flag=false,DFS(1,flag); 52 printf("%d ",ans); 53 return 0; 54 } 55 56 int sb=hh(); 57 int main(int argc,char**argv) {;}