游戏书 Choose your own path

本文探讨了一种被标记为“丧心病狂”的暴力解法在不同竞赛题目中的应用,包括Dijkstra、DFS和BFS算法的具体实现。通过对比分析,展现了针对特定年级学生设计的竞赛题目特点及解决方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

原出处在这里:DOMJ - CCC '18 J5
首先我把这个题面稍微改了一下加到团队内部比赛题目里面(为了切合主题)
然而题面丢了,,,比较尴尬,,,算了。。。看原出处的题去吧。。。
注意到文章标签:依然是“丧心病狂的暴力解法”,上次那个机器人大盗中已经讲过了我的那种写法种种坏处,这里就不赘述了QAQ
这次代码比上次短多了。。。机器人大盗是出给我们学校8,9年级同学的月赛题目,这次游戏书是出给7,8年级(好像8年级有点尴尬)的题。主要是考虑到七年级学弟学妹,,,以及比赛1个半小时3道题,OI制无模板。。。题目就比较水2333。。。

唠叨完了直接上代码:
我的Dijkstra:

#include <cstdio>
#include <iostream>
#include <algorithm>
#include <vector>

using namespace std;

const int INF=0x7fffffff;

struct edge
{
 int to,cost;
};

int n,d[10005],vis[10005],spot[10005],count_;

vector<edge> graph[10005];

void dijkstra(int s)
{
    int min1,k;
    for(int i=1;i<=n;i++)
        d[i]=INF;
    d[s]=0;
    for(int i=1;i<n;i++)
    {
        min1=INF;
        k=s;
        for(int j=1;j<=n;j++)
         if(!vis[j] && min1>d[j])
             min1=d[j],k=j;
     vis[k]=1;
        for(int j=0;j<graph[k].size();j++)
        {
            int t=graph[k][j].to;
            if(!vis[t] && min1+graph[k][j].cost<d[t])
                d[t]=min1+graph[k][j].cost;
        }
    }
    return;
}

int main()
{
 bool flag=true;
    int m,s,x,ans=INF;
    cin>>n;
    edge temp;
    for(int i=1;i<=n;i++)
    {
     cin>>m;
     if(m==0)
      spot[++count_]=i;
     for(int j=1;j<=m;j++)
     {
      cin>>temp.to;
      temp.cost=1;
         graph[i].push_back(temp);
  }
    }
    dijkstra(1);
    for(int i=2;i<=n;i++)
    {
     if(d[i]==INF)
     {
      flag=false;
      cout<<"N"<<endl;
      break;
  }
 }
 if(flag)
  cout<<"Y"<<endl;
    for(int i=1;i<=count_;i++)
     ans=min(ans,d[spot[i]]);
    cout<<ans+1;
    return 0;
}

唉这个优快云的排版看得我好难受。。。算了就这样凑合着看看吧。。。

接下来还是上次那位写DFS的神犇写的DFS:(还是有点错,想想看在哪里?)

#include<cstdio>
#include<cstdlib>
#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
int n,rest,last;
bool been[10001]={0},mark[10001]={0};
vector<int> next_[10001];
void dfs(int now,int read)
{
 if(next_[now].size()==0 && read<last) 
  last=read;
 if(been[now]==1)
  return;
 been[now]=mark[now]=1;
 for(int i=0;i<next_[now].size();++i)
  dfs(next_[now][i],read+1);
 been[now]=0;
}
inline void outt()
{
 for(int i=1;i<=n;++i)
 {
  if(mark[i]==0)
  {
   cout<<"N\n";
   return;
  }
 }
 cout<<"Y\n";
 return;
}
int main()
{
 ios::sync_with_stdio(false);
 cin>>n;
 last=rest=n;
 int m,temp;
 for(int i=1;i<=n;++i)
 {
  cin>>m;
  for(int j=0;j<m;++j)
  {
   cin>>temp;
   next_[i].push_back(temp);
  }
 }
 dfs(1,1);
 outt();
 cout<<last;
 return 0;
}

我的BFS:

#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<iostream>
#include<vector>
#include<queue>

using namespace std;

int n,m,ans[10001],count_,sc,first,deep[10001];
vector<int> v[10001];
bool b1[10001],er[10001],flag;
bool visit[10001];
queue<int> q,temp;

int main()
{
 ios::sync_with_stdio(false);
    cin>>n;
    for(int i=1;i<=n;i++)
    {
        int m,to;
        cin>>m;
        for(int j=0;j<m;j++)
        {
            cin>>to;
            v[i].push_back(to);
        }
    }
    b1[1]=1;
    q.push(1);
    int nn;
    deep[1]=1;
    while(!q.empty())
    {
     nn=q.front();
        q.pop();
        for(int i=0;i<v[nn].size();i++)
         if(deep[v[nn][i]]!=0)
          deep[v[nn][i]]=min(deep[nn]+1,deep[v[nn][i]]);
         else
          deep[v[nn][i]]=deep[nn]+1;
        int j=v[nn].size();
        for(int i=0;i<j;i++)
            if(!b1[v[nn][i]])
            {
             temp.push(v[nn][i]);
                b1[v[nn][i]]=1;
          q.push(v[nn][i]);
                if(v[v[nn][i]].size()==0 && !flag)
                {
                 flag=true;
                 first=deep[v[nn][i]];
    }
            }
        sc++;
    }
    if(n!=sc)
    {
     if(v[1].size()==0)
      first=1;
        cout<<"N"<<endl<<first;
 }
    else
        cout<<"Y"<<endl<<first;
    return 0;
}

完结撒花,希望这个文章标签不要更多了QAQ

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值