usaco Street Race

图一表示一次街道赛跑的跑道。可以看出有一些路口(用 0 到 N 的整数标号),和连接这些路口的箭头。路口 0 是跑道的起点,路口 N 是跑道的终点。箭头表示单行道。运动员们可以顺着街道从一个路口移动到另一个路口(只能按照箭头所指的方向)。当运动员处于路口位置时,他可以选择任意一条由这个路口引出的街道。

图一:有 10 个路口的街道

一个良好的跑道具有如下几个特点:

  • 每一个路口都可以由起点到达。
  • 从任意一个路口都可以到达终点。
  • 终点不通往任何路口。

运动员不必经过所有的路口来完成比赛。有些路口却是选择任意一条路线都必须到达的(称为“不可避免”的)。在上面的例子中,这些路口是 0,3,6,9。对于给出的良好的跑道,你的程序要确定“不可避免”的路口的集合,不包括起点和终点。

假设比赛要分两天进行。为了达到这个目的,原来的跑道必须分为两个跑道,每天使用一个跑道。第一天,起点为路口 0,终点为一个“中间路口”;第二天,起点是那个中间路口,而终点为路口 N。对于给出的良好的跑道,你的程序要确定“中间路口”的集合。如果良好的跑道 C 可以被路口 S 分成两部分,这两部分都是良好的,并且 S 不同于起点也不同于终点,同时被分割的两个部分满足下列条件:(1)它们之间没有共同的街道(2)S 为它们唯一的公共点,并且 S 作为其中一个的终点和另外一个的起点。那么我们称 S 为“中间路口 ”。在例子中只有路口 3 是中间路口。

数据量很小,直接暴力dfs

/*
ID: modengd1
PROG: race3
LANG: C++
*/
#include <iostream>
#include <stdio.h>
#include <memory.h>
#include <vector>
using namespace std;

bool G[101][101];
int color[101];
vector<int> ans1;
vector<int> ans2;
bool dfs(int v,int m)//是否可以走到终点
{
    color[v]=1;
    if(v==m)
        return true;
    for(int i=0;i<=m;i++)
    {
        if(G[v][i]&&!color[i])
        {
            if(dfs(i,m))
                return true;
        }
    }
    return false;
}
bool dfs2(int v,int m)//是否不会遇上以前搜过的点
{
    if(color[v]==1)
        return false;
    color[v]=2;
    for(int i=0;i<=m;i++)
    {
        if(G[v][i]&&color[i]!=2&&!dfs2(i,m))
            return false;
    }
    return true;
}
int main()
{
    freopen("race3.in","r",stdin);
    freopen("race3.out","w",stdout);
    int a,b,m;
    m=0;
    memset(G,false,sizeof(G));
    for(int i=0;scanf("%d",&a)&&a!=-1;i++)
    {
        if(a==-2)
            continue;
        m=max(m,a);
        G[i][a]=true;
        for(int j=0;scanf("%d",&a)&&a!=-2;j++)
        {
            G[i][a]=true;
            m=max(m,a);
        }
    }
    for(int i=1;i<m;i++)
    {
        memset(color,0,sizeof(color));
        color[i]=1;
        if(!dfs(0,m))
        {
            ans1.push_back(i);
            color[i]=0;
            if(dfs2(i,m))
                ans2.push_back(i);
        }
    }
    cout<<ans1.size();
    for(int i=0;i<ans1.size();i++)
        cout<<‘ ‘<<ans1[i];
    cout<<endl;
    cout<<ans2.size();
    for(int i=0;i<ans2.size();i++)
        cout<<‘ ‘<<ans2[i];
    cout<<endl;
    return 0;
}

  

时间: 2024-12-17 17:13:43

usaco Street Race的相关文章

USACO Section 4.3 Street Race(图的连通性+枚举)

虽说是IOI'95,但是也是挺水的..for 第一问,n最大为50,所以可以直接枚举起点和终点之外的所有点,然后dfs判断是否连通:for 第二问,易知答案一定是第一问的子集,所以从第一问中的答案中枚举,也是用dfs判断. #include<cstdio> #include<iostream> #include<cstring> #include<algorithm> #include<vector> #define rep(i,r) for(i

Street Race

图一:有 10 个路口的街道 一个良好的跑道具有如下几个特点: 每一个路口都可以由起点到达. 从任意一个路口都可以到达终点. 终点不通往任何路口. 运动员不必经过所有的路口来完成比赛.有些路口却是选择任意一条路线都必须到达的(称为“不可避免”的).在上面的例子中,这些路口是 0,3,6,9.对于给出的良好的跑道,你的程序要确定“不可避免”的路口的集合,不包括起点和终点. 假设比赛要分两天进行.为了达到这个目的,原来的跑道必须分为两个跑道,每天使用一个跑道.第一天,起点为路口 0,终点为一个“中间

COGS 696. [IOI1996][USACO 2.3] 最长前缀

★   输入文件:prefix.in   输出文件:prefix.out   简单对比时间限制:1 s   内存限制:128 MB 描述 USACO 2.3.1 IOI96 在生物学中,一些生物的结构是用包含其要素的大写字母序列来表示的.生物学家对于把长的序列分解成较短的序列(即元素)很感兴趣. 如果一个集合 P 中的元素可以通过串联(元素可以重复使用,相当于 Pascal 中的 “+” 运算符)组成一个序列 S ,那么我们认为序列 S 可以分解为 P 中的元素.元素不一定要全部出现(如下例中B

USACO prefix TrieTree + DP

/* ID:kevin_s1 PROG:prefix LANG:C++ */ #include <iostream> #include <cstdio> #include <string> #include <cstring> #include <vector> #include <map> #include <set> #include <algorithm> #include <cstdlib>

【USACO 1.3.4】牛式

[題目描述 ] 下面是一个乘法竖式,如果用我们给定的那n个数字来取代*,可以使式子成立的话,我们就叫这个式子牛式. * * * x * * ---------- * * * * * * ---------- * * * * 数字只能取代*,当然第一位不能为0,况且给定的数字里不包括0. 注意一下在美国的学校中教的"部分乘积",第一部分乘积是第二个数的个位和第一个数的积,第二部分乘积是第二个数的十位和第一个数的乘积. 写一个程序找出所有的牛式. [格式] INPUT FORMAT: (f

USACO Chapter 1 Section 1.1

USACO的题解和翻译已经很多了... 我只是把自己刷的代码保存一下. 1.PROB Your Ride Is Here 1 /* 2 ID:xiekeyi1 3 PROG:ride 4 LANG:C++ 5 */ 6 7 #include<bits/stdc++.h> 8 using namespace std ; 9 10 int main() 11 { 12 freopen("ride.in","r",stdin); 13 freopen(&quo

【最短路】【Heap-dijkstra】Gym - 101147B - Street

按题意把图建出来跑最短路就行了.注意遮挡不会影响答案,所以不必考虑,因为走直线经过遮挡的时候,一定不会比答案更优. #include<cstdio> #include<algorithm> #include<queue> #include<cmath> #include<cstring> using namespace std; #define EPS 0.00000001 #define N 109 int T,n,H,X; int hs[N]

USACO Your Ride Is Here

[USACO]Your Ride Is Here It is a well-known fact that behind every good comet is a UFO. These UFOs often come to collect loyal supporters from here on Earth. Unfortunately, they only have room to pick up one group of followers on each trip. They do,

usaco月赛,2017.1总结

T1:跳舞的奶牛 大致题意:一个体积为k的舞台能够同时容纳k只奶牛一起跳舞,他们每头奶牛的跳舞时间不同,如果有一只奶牛跳完了第k+1头奶牛就会立刻上场跳舞,当所有奶牛跳完舞以后我们认为这次表演结束.现在给出奶牛个数,最多用时,每头奶牛的跳舞时间.求舞台最小为多大. 思路:本来写了个程序以为这道题很简单,刚开始排一下序然后就行了,结果交了以后发现只过了五组,然后才发现这道题不能改变顺序(所以说为什么我改变顺序了还是能过五组,usaco的数据也好水......),所以说我想到了堆,然后就用堆写了一下