1. 程式人生 > >遊戲書 Choose your own path

遊戲書 Choose your own path

原出處在這裡: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; }

唉這個CSDN的排版看得我好難受。。。算了就這樣湊合著看看吧。。。

接下來還是上次那位寫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