【天梯赛历年真题题解】L3

能力有限,好多题没A出来

L3-001 凑零钱

#include<bits/stdc++.h>
using namespace std;
 int a[10003];
 int dp[10003][103]={0};
vector<int>res;
int N;
void dfs(int i,int j)
{
    if(i==N+1) return ;  
    if(j-a[i]>=0&&dp[i+1][j-a[i]]==1)
    {
         res.push_back(a[i]);
         dfs(i+1,j-a[i]);      
        return ;
    }
      if(dp[i+1][j]==1)
    {
        dfs(i+1,j);
       
    }
}
int main()
{
    
   int M;
    cin>>N>>M;
   
    for(int i=1;i<=N;i++)
        cin>>a[i];
    sort(a+1,a+N+1);
    dp[N+1][0]=1;  
    
    for(int i=N;i>=1;i--)
    {
        for(int j=0;j<=M;j++)
        {
            if(j<a[i])
                dp[i][j]=dp[i+1][j];
            else
            {
                dp[i][j]=dp[i+1][j]||dp[i+1][j-a[i]];
                    
            }
        }
    }
    if(dp[1][M]==0)
        cout<<"No Solution"<<endl;
    else
    {
        dfs(1,M);
        for(int i=0;i<res.size()-1;i++)
            cout<<res[i]<<" ";
        cout<<res[res.size()-1];
    }
	return 0;
 } 

L3-002 特殊堆栈

#include<bits/stdc++.h>
using namespace std;
int main()
{
    int N;
    cin>>N;
    string s;
    stack<int>sk;
    vector<int>skk;
    while(N--)
    {
        cin>>s;
        if(s=="Pop")
        {
            if(sk.empty())
                cout<<"Invalid"<<endl;
            else
            {
                int k=sk.top();
                cout<<sk.top()<<endl;
                sk.pop();
             //  skk.erase()
                auto i =lower_bound(skk.begin(),skk.end(),k);
                skk.erase(i);
               
            }
        }else if(s=="PeekMedian")
        {
            if(sk.empty())
            {
                cout<<"Invalid"<<endl;
                continue;
            }
            if(sk.size()%2==0)
            {
                int n=skk.size()/2;
                cout<<skk[n-1]<<endl;
            }
            else
            {
                int n=(skk.size()+1)/2;
                cout<<skk[n-1]<<endl;
            }
        }
        else if(s=="Push")
        {
            int x;
            cin>>x;
            sk.push(x);
            auto i = upper_bound(skk.begin(),skk.end(),x);
            skk.insert(i,x);
        }


    }
	return 0;
 } 

L3-003 社交集群

#include<bits/stdc++.h>
using namespace std;
int f[10000];
int Find(int x)//查找它的祖先是谁 
{
	if(f[x]==x)
		return x;
	else
		return f[x]=Find(f[x]);
}
void Ban(int x,int y)//合并 
{
	int tx=Find(x);
	int ty=Find(y);
	if(tx!=ty)
	{
		f[ty]=tx;
	}
}
int main()
{
    int N;
    cin>>N;
    for(int i=1;i<=N;i++)
        f[i]=i;
    int vis[10000]={0};
    int K;
    char c;
   for(int i=1;i<=N;i++)
   {
       cin>>K>>c;
       for(int j=0;j<K;j++)
       {
           int x;
           cin>>x;
           if(!vis[x])
           {
               vis[x]=i;
           }
           else
           {
               Ban(i,vis[x]);
           }
       }      
   }
    unordered_map<int,int>ans;
    for(int i=1;i<=N;i++)
    {
        int x=Find(i);
        ans[x]++;
    }
    vector<int>res;
    for(auto i : ans)
       
          res.push_back(i.second);
    sort(res.rbegin(),res.rend());
    cout<<res.size()<<endl;
    for(int i=0;i<res.size()-1;i++)
        cout<<res[i]<<" ";
    cout<<res[res.size()-1];
	return 0;
 } 

L3-004 肿瘤诊断

//通过游戏里不同的操作或选择可以从某个剧情点去往另外一个剧情点
#include<bits/stdc++.h>
using namespace std;
int G[1300][130][70];
int vis[1300][130][71]={0};
int dir[6][3]={{-1,0,0},{1,0,0},{0,-1,0},{0,1,0},{0,0,-1},{0,0,1}};
int M,N,L,T;
// long long  cnt;
// void dfs(int x,int y,int z)
// {
//     cnt++;
//     vis[x][y][z]=1;
//     for(int i=0;i<6;i++)
//     {
//         int tx=x+dir[i][0];
//         int ty=y+dir[i][1];
//         int tz=z+dir[i][2];
//         if(tx>=0&&ty>=0&&tz>=0&&tx<M&&ty<N&&tz<L&&!vis[tx][ty][tz]&&G[tx][ty][tz])
//         {           
//             dfs(tx,ty,tz);
//         }
//     }
// }
struct Node
{
    int x;
    int y;
    int z;
    Node(int x,int y,int z){
        this->x=x;
        this->y=y;
        this->z=z;
    }
};
long long int bfs(int x,int y,int z)
{
    queue<Node>Q;
    Q.push(Node(x,y,z));
    vis[x][y][z]=1;
    long long sum=0;
    while(!Q.empty())
    {
        Node head=Q.front();
        Q.pop();    
         sum++;  
        for(int i=0;i<6;i++)
        {
            int tx=head.x+dir[i][0];
            int ty=head.y+dir[i][1];
            int tz=head.z+dir[i][2];
            if(tx>=0&&ty>=0&&tz>=0&&tx<M&&ty<N&&tz<L&&!vis[tx][ty][tz]&&G[tx][ty][tz])
            {           
                Q.push(Node(tx,ty,tz));
                vis[tx][ty][tz]=1;
            }
        }
    }
    
    return sum>=T?sum:0;
}
int main()
{
		
  
    cin>>M>>N>>L>>T;
    long long int res=0;
    for(int k=0;k<L;k++)
    {
        for(int i=0;i<M;i++)
        {
            for(int j=0;j<N;j++)
            {
                cin>>G[i][j][k];
            }
        }
    }
    for(int k=0;k<L;k++)
    {
        for(int i=0;i<M;i++)
        {
            for(int j=0;j<N;j++)
            {
               if((G[i][j][k]==1)&&(vis[i][j][k]==0))
               {
                   res=res+bfs(i,j,k);
                  // cout<<bfs(i,j,k)<<" ";
               }
            }
        }
    }
    cout<<res;
    return 0;
   }

L3-005 垃圾箱分布

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
map<string,int>bm;
vector<pair<int,int>>G[100005];
int vis[100005];
ll dis[100005];
int main()
{
   int N,M,K,D;
    cin>>N>>M>>K>>D;
   int cnt=N+1;   
   while(K--)
   {
       string s1,s2;
       int w;
       cin>>s1>>s2>>w;
       int u,v;
       if(s1[0]=='G')
       {
           if(bm.count(s1))
               u=bm[s1];
           else
           {
               bm[s1]=cnt++;
               u=bm[s1];
           }
       }
       else
           u=atoi(s1.data());       
       if(s2[0]=='G')
       {
           if(bm.count(s2))
               v=bm[s2];
           else
           {
               bm[s2]=cnt++;
               v=bm[s2];
           }
           
       }
       else
           v=atoi(s2.data());      
       G[u].push_back({v,w});
       G[v].push_back({u,w});      
    }   
    //枚举所有垃圾桶 10
    //单元最短
    string res_name="-1";
    double res_Min=-1;
    double res_age=0x3f3f3f3f;   
    for(auto it : bm)
    {
        int u=it.second;
        string name=it.first;
        priority_queue<pair<int,int>,vector<pair<int,int>>,greater<pair<int,int>>>Q;
        Q.push({0,u});
        memset(dis,0x3f3f3f3f,sizeof(dis));
        memset(vis,0,sizeof(vis));
        dis[u]=0;
        while(!Q.empty())
        {
            int u=Q.top().second;
            int d=Q.top().first;
            Q.pop();
            if(vis[u])
                continue;
            vis[u]=1;
            for(auto it : G[u])
            {
                int v=it.first;
                int w=it.second;
                if(dis[v]>d+w)
                {
                    dis[v]=d+w;
                    Q.push({dis[v],v});
                }
            }
        }
        int judge=1;
        double sum=0;
        ll Min=0x3f3f3f3f;
        for(int i=1;i<=N;i++)
        {
            if(dis[i]>D)
            {
                judge=0;
                break;
            }
            Min=min(Min,dis[i]);
            sum+=dis[i];
        }//
        if(!judge)
            continue;
        if(res_Min<Min)
        {
            res_name=name;
            res_Min=Min;
            res_age=sum;
        }else if(res_Min==Min)
        {
            if(res_age>sum)
            {
                res_name=name;
                res_Min=Min;
                res_age=sum;                 
            }           
        }
      //  cout<<name<<" "<<Min<<" "<<sum<<endl;
    }
    if(res_name=="-1")
    {
        cout<<"No Solution";
    }
    else
    {
        cout<<res_name<<endl;
        double res=res_age*1.0/N;
        printf("%.1f %.1f",res_Min,res);
    }
	return 0;
 } 

L3-006 迎风一刀斩


L3-007 天梯地图

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
struct Node
{
    int u;
    ll t,w;
    Node(int u,ll t,ll w){
        this->u=u;
        this->t=t;
        this->w=w;
    }
};
vector<Node>G[10005];
ll dis[10005];
ll sum[10005];
int vis[10005];
int path[10005];
vector<int>ans1,ans2;
void print(vector<int>&ans,int x,int s)
{
    if(x==s)
    {
        ans.push_back(x);
        return ;
    }
    print(ans,path[x],s);
    ans.push_back(x);
}
int dj1(int s,int e)
{
    priority_queue<pair<ll,int>,vector<pair<ll,int>>,greater<pair<ll,int>>>Q;
    Q.push({0,s});
    memset(dis,0x3f3f3f3f,sizeof(dis));
    memset(vis,0,sizeof(vis));
    memset(sum,0,sizeof(sum));
    dis[s]=0;    
    while(!Q.empty())
    {
        int u=Q.top().second;
        int d=Q.top().first;
        Q.pop();
        if(vis[u])
            continue;
        vis[u]=1;
        for(auto it : G[u])
        {
            ll t=it.t;
            int v=it.u;
            ll w=it.w;
            if(dis[v]>d+t)
            {
                dis[v]=d+t;
                path[v]=u;
                sum[v]=sum[u]+w;
                Q.push({dis[v],v});
            }else if(dis[v]==d+t)
            {
                if(sum[v]>sum[u]+w)
                {
                    sum[v]=sum[u]+w;
                    path[v]=u;
                    
                }
            }
        }
    }
    print(ans1,e,s);
    return dis[e];
}
int dj2(int s,int e)
{
        priority_queue<pair<ll,int>,vector<pair<ll,int>>,greater<pair<ll,int>>>Q;
    Q.push({0,s});
    memset(dis,0x3f3f3f3f,sizeof(dis));
    memset(vis,0,sizeof(vis));
    memset(sum,0,sizeof(sum));
    dis[s]=0;    
    while(!Q.empty())
    {
        int u=Q.top().second;
        int d=Q.top().first;
        Q.pop();
        if(vis[u])
            continue;
        vis[u]=1;
        for(auto it : G[u])
        {
            ll t=it.t;
            int v=it.u;
            ll w=it.w;
            if(dis[v]>d+w)
            {
                dis[v]=d+w;
                path[v]=u;
                sum[v]=sum[u]+1;
                Q.push({dis[v],v});
            }else if(dis[v]==d+w)
            {
                if(sum[v]>sum[u]+1)
                {
                    sum[v]=sum[u]+1;
                    path[v]=u;
                    
                }
            }
        }
    }
    print(ans2,e,s);
    return dis[e];
}
int main()
{
    int n,m;
    cin>>n>>m;
    while(m--)
    {
        int x,y,type,t,w;
        cin>>x>>y>>type>>w>>t;
        G[x].push_back(Node(y,t,w));
        if(!type)
            G[y].push_back(Node(x,t,w));
    }
    int s,e;
    cin>>s>>e;
    ll res1=dj1(s,e);
    ll res2=dj2(s,e);
    if(ans1==ans2)
    {
        printf("Time = %d; Distance = %d: ",res1,res2);
        for(int i=0;i<ans1.size();i++)
        {
            if(i==0)
                cout<<ans1[i];
            else
                cout<<" => "<<ans1[i];
        }
    }
    else
    {
        printf("Time = %d: ",res1);
        for(int i=0;i<ans1.size();i++)
        {
            if(i==0)
                cout<<ans1[i];
            else
                cout<<" => "<<ans1[i];
        }
        cout<<endl;
        printf("Distance = %d: ",res2);
        for(int i=0;i<ans2.size();i++)
        {
            if(i==0)
                cout<<ans2[i];
            else
                cout<<" => "<<ans2[i];
        }
    }
    return 0;
}

L3-008 喊山

#include<bits/stdc++.h>
using namespace std;
vector<int>G[10001];
int maxk=0;
int minn=10001;
int dis[10001];
int vis[10001];
int main()
{
    int n,m,k;
    cin>>n>>m>>k;
    for(int i=0;i<m;i++)
    {
        int x,y;
        cin>>x>>y;
        G[x].push_back(y);
        G[y].push_back(x);
    }
    
    for(int i=0;i<k;i++)
    {
        int x;
        cin>>x;
        priority_queue<pair<int,int>,vector<pair<int,int>>,greater<pair<int,int>> >Q;
        //10000
        memset(vis,0,sizeof(vis));
        memset(dis,0x3f3f3f3f,sizeof(dis));
        Q.push({0,x});
        dis[x]=0;     
        while(!Q.empty())
        {
            int u=Q.top().second;
            int d=Q.top().first;
            Q.pop();
            if(vis[u])
                continue;
            vis[u]=1;
            for(auto v : G[u])
            {
                if(dis[v]>d+1)
                {
                    dis[v]=d+1;
                    Q.push({dis[v],v});
                }
            }
        }
        int Max=-1;
        int ans=0;
        for(int i=1;i<=n;i++)
        {
            if(dis[i]==0x3f3f3f3f)
                continue;
            if(Max<dis[i])
            {
                Max=dis[i];
                ans=i;
            }
        }
        if(Max==0)
        {
            cout<<0<<endl;
        }
        else
            cout<<ans<<endl;
    }
	return 0;
 } 

L3-009 长城


L3-010 是否完全二叉搜索树

#include<bits/stdc++.h>
using namespace std;
int ok=1;
int maxn=INT_MAX;
struct Node
{
    long long val;
    Node *l;
    Node *r;
    Node(long long val,Node *l,Node *r){
        this->val=val;
        this->l=l;
        this->r=r;
    }       
};
vector<int>res;
void dfs(Node *head,int k)
{
    if(!ok)
        return ;
    if(head==NULL)
    {
        res.push_back(k);
        return ;
    }
     dfs(head->l,k+1);
     dfs(head->r,k+1);
}
void create(Node *&root,long long val)
{
    if(root==NULL)
    {
        root=new Node(val,NULL,NULL);
        return ;
    }
    if(root->val>val)
        create(root->r,val);
    else
        create(root->l,val);
}
int main()
{
    int N;
    cin>>N;
    Node *root=NULL;
    while(N--)
    {
        long long x;
        cin>>x;        
        create(root,x);        
    }
    queue<Node*>Q;
    Q.push(root);
    vector<long long>ans;
    while(!Q.empty())
    {
        Node *head=Q.front();
        Q.pop();
        ans.push_back(head->val);
        if(head->l!=NULL) Q.push(head->l);
        if(head->r!=NULL) Q.push(head->r);
    }
    for(int i=0;i<ans.size();i++)
    {
        if(i!=0)
            cout<<" "<<ans[i];
         else cout<<ans[i];
     }
    cout<<endl;
    dfs(root,0);
    unordered_set<int>se;
    int per=0x3f3f3f3f;
    for(int i=0;i<res.size();i++)
    {
        se.insert(res[i]);
        if(res[i]>per)
        {
            ok=0;
            break;
        }
        per=res[i];
    }
    if(ok==1&&se.size()<=2)
        cout<<"YES"<<endl;
    else 
        cout<<"NO"<<endl;
	return 0;
 } 


L3-011 直捣黄龙


#include<bits/stdc++.h>
using namespace std;
struct Node
{
    int d;
    string u;
    bool operator<( const Node &n1) const
    {
        return this->d > n1.d;
    }
    Node(string u,int d){
        this->u=u;
        this->d=d;
    }
    Node(){}
};

int main()
{
    int N,M;
    string S,E;
    cin>>N>>M>>S>>E;
    unordered_map<string,vector< pair<string,int> > >G;
    unordered_map<string,int>w;//
    w[S]=0;
    unordered_map<string,int>d;//初始化完毕
    unordered_map<string,int>vis;
    unordered_map<string,int>Maxsum;
    unordered_map<string,int>Maxlj;
    Maxlj[S]=1;
    unordered_map<string,int>sumlj;
    sumlj[S]=1;
    unordered_map<string,string>path;
    unordered_map<string,int>usum;    
    for(int i=1;i<N;i++)//每行给出除了己方大本营外的一个城镇的代号和驻守的敌军数量
    {
        string s;
        int val;
        cin>>s>>val;
        w[s]=val;
        d[s]=0x3f3f3f3f;      
    }
    d[S]=0;
    while(M--)
    {
        string u,v;
        int val;   
        cin>>u>>v>>val;
        G[u].push_back({v,val});
        G[v].push_back({u,val});
    }
   
    priority_queue<Node>Q;    
    Q.push(Node(S,0));
    
    while(!Q.empty())
    {
        Node head=Q.top();
        Q.pop();
        if(vis.count(head.u))
            continue ;
        vis[head.u]=1;
        if(!G.count(head.u))
            continue ;
        for(int i=0;i<G[head.u].size();i++)
        {
            string next=G[head.u][i].first;
            int Val=G[head.u][i].second;
            if(d[next]>d[head.u]+Val)
            {
                d[next]=d[head.u]+Val;
              
                 sumlj[next]=sumlj[head.u];
                
                Maxlj[next]=Maxlj[head.u]+1;
                
                usum[next]=usum[head.u]+w[next];
                
                 path[next]=head.u;
                
                Q.push(Node(next,d[next]));
            }
            else if(d[next]==d[head.u]+Val)
            {
                    sumlj[next]+=sumlj[head.u];//路径总和
                    if(Maxlj[head.u]+1>Maxlj[next])//最长路径
                    {
                         path[next]=head.u;
                         Maxlj[next]=Maxlj[head.u]+1;
                         usum[next]=usum[head.u]+w[next];
                    }
    				else if(Maxlj[next]==Maxlj[head.u]+1)//
                    {
                        if(usum[next]<usum[head.u]+w[next])//顶点最大和
                        {
                             path[next]=head.u;
                             usum[next]=usum[head.u]+w[next];
                        }
                    }
              }
                
            }
        }
     //  cout<<d["DBY"];
        stack<string>sk;
        sk.push(E);
        string t=path[E];
        while(t!=S)
        {
            sk.push(t);
            t=path[t];         
        }
        cout<<S;
        while(!sk.empty())
        {
            cout<<"->"<<sk.top();
            sk.pop();
        }
        cout<<endl;
        
       cout<<sumlj[E]<<" "<<d[E]<<" "<<usum[E];
 // cout<<d[E]<<" "<<sumlj[E]<<" ";
	return 0;
 } 

L3-012 水果忍者


L3-013 非常弹的球

#include<bits/stdc++.h>
using namespace std;
int main()
{
    double m,p;
    cin>>m>>p;
    double e=1000;
    m/=100;
    double v=sqrt(2*e/m);
    double x=0.0;
    double g=9.8;
    while(v>0.00001)
    {        
        x+=e/(m*g/2);
        e=(1-p/100)*e;
        v=sqrt(2*e/m);        
    }
    printf("%.3f",x);
    return 0;
}

L3-014 周游世界


L3-015 球队“食物链

#include<bits/stdc++.h>
using namespace std;
int vis[21]={0};
int a[22];
int G[21][21]={0};
int ok=0;
void dfs(int s,int u,int k,int N)
{
    if(ok==1)
        return;
    if(k==N)
    {
        if(G[u][s]==1)
        {
            ok=1;
            return ;
        }
        return ;
    }
    int ye=0;
    for(int i=1;i<=N;i++)
    {
        if(vis[i]==0&&G[i][s]==1)
            ye=1;
    }
    if(ye==0)
        return ;
    for(int i=1;i<=N;i++)
    {
        if(ok==1)
            return;      
        if(vis[i]==0&&G[u][i]==1)
        {
            vis[i]=1;
            a[k]=i;
            dfs(s,i,k+1,N);
            vis[i]=0;
        }
    }
}
int main()
{
		
    int N;
    cin>>N;
    for(int i=1;i<=N;i++)
    {
        for(int j=1;j<=N;j++)
        {
            char c;
            cin>>c;
          
            if(c=='W')
                G[i][j]=1;
            if(c=='L')
                G[j][i]=1;
        }
    }
    
    for(int i=1;i<=N;i++)
    {
         memset(vis,0,sizeof(vis));
         vis[i]=1;
         dfs(i,i,1,N);    
         if(ok==1)
         {
            cout<<i<<" ";
            for(int j=1;j<N;j++)
            {
                if(j==1)
                    cout<<a[j];
                else cout<<" "<<a[j];
            }
            break;
        }
    }
    if(ok==0)
        cout<<"No Solution";
    return 0;
   }

L3-016 二叉搜索树的结构

#include<bits/stdc++.h>
using namespace std;
int cnt=0;
long long dp[1000001][4];
int main()
{
    string s;
    cin>>s;  
    int n=s.length();
    s='0'+s;
    memset(dp,0,sizeof(dp));
    dp[0][0]=1;
    for(int i=1;i<=n;i++)
    {
        for(int j=0;j<=3;j++)
        {
            if(j>0)
                 dp[i][j]+=dp[i-1][j-1];
            dp[i][j]+=dp[i-1][j];
            for(int k=i-1;k>=1&&(j-(i-k)>=0);k--)
            {
                if(s[k]==s[i])
                {
                    dp[i][j]-=dp[k-1][j-(i-k)];
                    break;
                }
                
            }
        }
    }
    long long sum=0;
   for(int i=0;i<=3;i++)
   {
       sum+=dp[n][i];
   }
    cout<<sum;
    return 0;
   }

L3-017 森森快递


L3-018 森森美图


L3-019 代码排版


L3-020 至多删三个字符

#include<bits/stdc++.h>
using namespace std;
int cnt=0;
long long dp[1000001][4];
int main()
{
    string s;
    cin>>s;  
    int n=s.length();
    s='0'+s;
    memset(dp,0,sizeof(dp));
    dp[0][0]=1;
    for(int i=1;i<=n;i++)
    {
        for(int j=0;j<=3;j++)
        {
            if(j>0)
                 dp[i][j]+=dp[i-1][j-1];
            dp[i][j]+=dp[i-1][j];
            for(int k=i-1;k>=1&&(j-(i-k)>=0);k--)
            {
                if(s[k]==s[i])
                {
                    dp[i][j]-=dp[k-1][j-(i-k)];
                    break;
                }
                
            }
        }
    }
    long long sum=0;
   for(int i=0;i<=3;i++)
   {
       sum+=dp[n][i];
   }
    cout<<sum;
    return 0;
   }

L3-021 神坛


L3-022 地铁一日游

#include<bits/stdc++.h>
#define inf 0x3f3f3f3f
using namespace std;
int vis[210];
int G[210][210];
int ed[210]={0};
vector<int>st[201];
void dfs(int u)
{
    for(int i=0;i<st[u].size();i++)
    {
        if(vis[st[u][i]]==0)
        {
            vis[st[u][i]]=1;
            dfs(st[u][i]);            
        }
    }
}
int main()
{
		
    int N,M,K;
   
    memset(G,inf,sizeof(G));
    cin>>N>>M>>K;
   
    for(int i=1;i<=M;i++)
    {
        int a,b,w;
        cin>>a;
        ed[a]=1;
        while(cin>>w>>b)
        {
            G[a][b]=min(G[a][b],w);
            G[b][a]=min(G[b][a],w);
            a=b;
            if(getchar()=='\n') break;
        }
        ed[a]=1;
    }
   // cout<<"2";
    
    for(int k=1;k<=N;k++)
        for(int i=1;i<=N;i++)
        {
            for(int j=1;j<=N;j++)
            {
                if(i!=j)
                    G[i][j]=min(G[i][j],G[i][k]+G[k][j]);
            }
        }
  // cout<<"1";
    for(int i=1;i<=N;i++)
    {
        unordered_map<int,int>cost_dis;
        for(int j=1;j<=N;j++)
        {
            if(G[i][j]!=inf)
            {
                  int cost=G[i][j]/K+2;
                  cost_dis[cost]=max(cost_dis[cost],G[i][j]);//这个花费能跑多远
            }
        }
        for(int j=1;j<=N;j++)
        {
            if(G[i][j]==cost_dis[G[i][j]/K+2]||(G[i][j]!=inf&&ed[j]&&i!=j))
                 st[i].push_back(j);
        }
    }
  //  cout<<"3";
    int p;
    cin>>p;
    while(p--)
    {
        int x;
        cin>>x;
        memset(vis,0,sizeof(vis));
        vis[x]=1;
        dfs(x);
        set<int>ans;
        for(int i=1;i<=N;i++)
        {
            if(vis[i])
                ans.insert(i);
        }  
        vector<int>res;
        for(auto i : ans)
            res.push_back(i);
        for(int i=0;i<res.size();i++)
        {
            if(i==0)
                cout<<res[i];
            else cout<<" "<<res[i];
        }
        cout<<endl;
        
    }
    return 0;
   }

L3-023 计算图


L3-024 Oriol和David


L3-025 那就别担心了

#include<bits/stdc++.h>
using namespace std;
vector<int>G[10000];
int dp[100000];
int cnt=0;
int ok=0;
int dfs(int u,int e)
{
    
    if(u==e)
    {
        return 1;
    }
    
    int &ans=dp[u];
    if(ans!=-1) return dp[u];
    ans=0;
    for(int i=0;i<G[u].size();i++)
    {
        ans+=dfs(G[u][i],e);
    }
    if(ans==0)
        ok=1;
    return ans;
}  
int main()
{
		
    memset(dp,-1,sizeof(dp));
    int N,M;
    cin>>N>>M;
    while(M--)
    {
        int x,y;
        cin>>x>>y;
        G[x].push_back(y);
    }
    int x,y;
    cin>>x>>y;
    cout<<dfs(x,y)<<" ";

    
       if(ok==1)
           cout<<"No";
      else  cout<<"Yes";
    
  //  cout<<"Yes";
    return 0;
   }
  • 5
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值