SDUT 2021年全国天梯赛赛前个人专题强化赛---3(搜索1)题解

53 篇文章 8 订阅
5 篇文章 0 订阅

7-1 列出连通集 (25 分)

题目链接

答案

#include<bits/stdc++.h>
#define INF 0x3f3f3f3f
const int N = 11;
using namespace std;

int n,m;
int mp[N][N];
bool vis[N];

void DFS(int u){
    if(u>=n) return ;
    cout<<" "<<u;
    vis[u]=1;
    for(int i=0;i<n;i++){
        if(!vis[i]&&mp[u][i]){
            DFS(i);
        }
    }
}

void BFS(int u){
    queue<int>q;
    q.push(u);
    vis[u]=1;
    while(q.size()){
        int t=q.front();
        q.pop();
        cout<<" "<<t;
        for(int i=0;i<n;i++){
            if(!vis[i]&&mp[t][i]){
                q.push(i);
                vis[i]=1;
            }
        }
    }
}


int main(){
    cin>>n>>m;
    while(m--){
        int u,v;
        cin>>u>>v;
        mp[u][v]=mp[v][u]=1;
    }
    for(int i=0;i<n;i++){
        if(!vis[i]){
            cout<<"{";
            DFS(i);
            cout<<" }"<<endl;
        }
    }
    memset(vis,0,sizeof(vis));
    for(int i=0;i<n;i++){
        if(!vis[i]){
            cout<<"{";
            BFS(i);
            cout<<" }"<<endl;
        }
    }
    return 0;
}

7-2 Saving James Bond - Easy Version (25 分)

题目链接

答案

#include <iostream>
#include<bits/stdc++.h>
#define ll long long
#define PII pair<int,int>
#define pb push_back
const int N = 1e5 + 10;
using namespace std;

struct node{
    int x;
    int y;
}dp[N];

int n,d;
bool vis[N];
bool flag;

bool fp(int x){
    int px=pow(dp[x].x,2);
    int py=pow(dp[x].y,2);
    int r=(d+7.5)*(d+7.5);
    if(px+py<=r) return 1;
    return 0;
}

bool jump(int x,int y){ ///判断是否可以跳到另一个鳄鱼头
    int px=pow(dp[x].x-dp[y].x,2);
    int py=pow(dp[x].y-dp[y].y,2);
    int r=d*d;
    if(px+py<=r) return 1;
    return 0;
}

bool judge(int x){  ///判断是否可以到达岸边
    if((dp[x].x-d<=-50)||(dp[x].x+d>=50)||(dp[x].y-d<=-50)||(dp[x].y+d>=50)) return 1;
    return 0;
}

bool DFS(int x){
    vis[x]=1;
    if(judge(x)) flag=1;
    for(int i=0;i<n;i++){
        if(!vis[i]&&jump(x,i)){
            flag=DFS(i);
        }
    }
    return flag;
}

void solve(){
    memset(vis,0,sizeof(vis));
    cin>>n>>d;
    for(int i=0;i<n;i++){
        cin>>dp[i].x>>dp[i].y;
    }
    if(d>=42.5) puts("Yes");
    else{
        for(int i=0;i<n;i++){
            if(!vis[i]&&fp(i)){
                DFS(i);
            }
        }
        if(flag) puts("Yes");
        else puts("No");
    }
}

int main()
{
    solve();
    return 0;
}


7-3 地下迷宫探索 (30 分)

题目链接

答案

#include<bits/stdc++.h>
#define INF 0x3f3f3f3f
const int N = 1e4 + 10;
using namespace std;

int n,m,pos;
int mp[N][N];
int tot;
int dp[N];
bool vis[N];
bool flag;

void DFS(int u){
    //if(tot>=n) return ;
//    vis[u]=1;
//    cout<<u<<" ";
    if(flag) cout<<" ";
    else flag=1;
    cout<<u;
    dp[++tot]=u;
    for(int i=1;i<=n;i++){
        if(!vis[i]&&mp[u][i]){
            vis[i]=1;
            DFS(i);
            cout<<" "<<u;
        }
    }
}

int main(){
    cin>>n>>m>>pos;
    while(m--){
        int u,v;
        cin>>u>>v;
        mp[u][v]=mp[v][u]=1;
    }
    tot=0;
    flag=0;
    vis[pos]=1;
    DFS(pos);
//    if(tot==n){
//        for(int i=1;i<tot;i++){
//            cout<<dp[i]<<" ";
//        }
//        for(int i=tot;i>=1;i--){
//            if(i==1) cout<<dp[i]<<endl;
//            else cout<<dp[i]<<" ";
//        }
//    }
//    else{
//        for(int i=1;i<tot;i++){
//            cout<<dp[i]<<" ";
//        }
//        for(int i=tot;i>=1;i--){
//            if(i==1) cout<<dp[i]<<" 0"<<endl;
//            else cout<<dp[i]<<" ";
//        }
//    }
    if(tot<n) puts(" 0");
    return 0;
}

7-4 畅通工程之局部最小花费问题 (35 分)

题目链接

答案

#include <iostream>
#include<bits/stdc++.h>
#define ll long long
#define PII pair<int,int>
const int N = 1e5 + 10;
using namespace std;

struct node{
    int u;
    int v;
    int w;
    int p;
}dp[N];

int vis[N];


bool cmp(node x,node y){
    return x.w<y.w;
}

int Find(int x){
    if(x!=vis[x]) vis[x]=Find(vis[x]);
    return vis[x];
}

void solve(){
    int n;
    cin>>n;
    int m=n*(n-1)>>1;
    for(int i=1;i<=m;i++) vis[i]=i;
    for(int i=1;i<=m;i++){
        int u,v,w,p;
        cin>>u>>v>>w>>p;
        dp[i]={u,v,w,p};
        if(dp[i].p==1){
            int x=Find(dp[i].u);
            int y=Find(dp[i].v);
            if(x!=y){
                vis[x]=y;
            }
        }
    }
    sort(dp+1,dp+1+m,cmp);
    int minn=0;
    for(int i=1;i<=m;i++){
        int x=Find(dp[i].u);
        int y=Find(dp[i].v);
        if(x!=y){
            vis[x]=y;
            minn+=dp[i].w;
        }
    }
    cout<<minn<<endl;
}

int main()
{
    solve();
    return 0;
}


7-5 List Components (25 分)

题目链接

答案

#include<bits/stdc++.h>
#define INF 0x3f3f3f3f
const int N = 11;
using namespace std;

int n,m;
int mp[N][N];
bool vis[N];

void DFS(int u){
    if(u>=n) return ;
    cout<<" "<<u;
    vis[u]=1;
    for(int i=0;i<n;i++){
        if(!vis[i]&&mp[u][i]){
            DFS(i);
        }
    }
}

void BFS(int u){
    queue<int>q;
    q.push(u);
    vis[u]=1;
    while(q.size()){
        int t=q.front();
        q.pop();
        cout<<" "<<t;
        for(int i=0;i<n;i++){
            if(!vis[i]&&mp[t][i]){
                q.push(i);
                vis[i]=1;
            }
        }
    }
}


int main(){
    cin>>n>>m;
    while(m--){
        int u,v;
        cin>>u>>v;
        mp[u][v]=mp[v][u]=1;
    }
    for(int i=0;i<n;i++){
        if(!vis[i]){
            cout<<"{";
            DFS(i);
            cout<<" }"<<endl;
        }
    }
    memset(vis,0,sizeof(vis));
    for(int i=0;i<n;i++){
        if(!vis[i]){
            cout<<"{";
            BFS(i);
            cout<<" }"<<endl;
        }
    }
    return 0;
}

7-6 排座位 (25 分)

题目链接

答案

#include <iostream>
#include<bits/stdc++.h>
#define ll long long
#define ull unsigned long long
#define INF 0x3f3f3f3f
#define inf 0x3f3f3f3f3f3f3f3f
#define mem(a,b) memset(a,b,sizeof(a))
#define rep(i,a,b) for(auto i=a;i<=b;++i)
#define bep(i,a,b) for(auto i=a;i>=b;--i)
#define lowbit(x) x&(-x)
#define PII pair<int,int>
#define PLL pair<ll,ll>
#define PI acos(-1)
#define pb push_back
#define eps 1e-8
#define x first
#define y second
const int mod = 1e9 + 7;
const int MOD = 1e4+7;
const int N = 1e4 + 10;
const int M = 111;
int dx[]={-1, 0, 1, 0};
int dy[]={0, 1, 0, -1};
int dxy[][2]={{0,1},{1,0},{1,1},{-1,1}};
using namespace std;

int vis[N];
int mp[N][N];

void init(int n){
    for(int i=1;i<=n;i++) vis[i]=i;
}

int Find(int x){
    if(x!=vis[x]) vis[x]=Find(vis[x]);
    return vis[x];
}

void Merge(int u,int v){
    int x=Find(u);
    int y=Find(v);
    if(x!=y)  vis[x]=y;
}

void solve(){
    int n,m,k;
    cin>>n>>m>>k;
    init(n);
    while(m--){
        int u,v;
        int op;
        cin>>u>>v>>op;
        mp[u][v]=mp[v][u]=op;
        if(op==1) Merge(u,v);
    }
    while(k--){
        int x,y;
        cin>>x>>y;
        if(mp[x][y]==1) cout<<"No problem"<<endl;
        else if(mp[x][y]!=1&&mp[x][y]!=-1) cout<<"OK"<<endl;
        else if(mp[x][y]==-1&&Find(x)==Find(y)) cout<<"OK but..."<<endl;
        else if(mp[x][y]==-1&&Find(x)!=Find(y)) cout<<"No way"<<endl;
    }
}

int main() {
    ios::sync_with_stdio(0);
    cin.tie(0);
    cout.tie(0);
    solve();
	return 0;
}

7-7 红色警报 (25 分)

题目链接

答案

#include <iostream>
#include<bits/stdc++.h>
#define PII pair<int,int>
#define mem(a,b) memset(a,b,sizeof(a))
const int N = 555;
using namespace std;

int n,m;
int mp[N][N];
bool vis[N];
int tot;

void DFS(int p){ ///DFS寻找连通分量个数
    for(int i=0;i<n;i++){
        if(!vis[i]&&mp[p][i]){
            vis[i]=1;
            DFS(i);
        }
    }
}

int main(){
    cin>>n>>m;
    while(m--){
        int u,v;
        cin>>u>>v;
        mp[u][v]=mp[v][u]=1; ///连通u,v
    }
    for(int i=0;i<n;i++){ ///先计算连通分量的个数
        if(!vis[i]){
            DFS(i);
            tot++;
        }
    }
//    cout<<tot<<endl;
    int q;
    cin>>q;
    int cnt;
    int num=q;
    while(q--){
        int x;
        cin>>x;
        for(int i=0;i<n;i++){
            ///将所有与x相连的点取消连通标
            if(mp[x][i]) mp[x][i]=mp[i][x]=0;
        }
        cnt=0;
        mem(vis,0);
        ///当去掉City x的连通分量个数
        for(int i=0;i<n;i++){
            if(!vis[i]){
                DFS(i);
                cnt++;
            }
        }
//        cout<<tot<<" "<<cnt<<endl;
//        cout<<cnt<<endl;
        ///当失去City x时,更改了其他城市的连通性,即连通分量增加了2以上
        if(cnt>=tot+2) printf("Red Alert: City %d is lost!\n",x);
        else printf("City %d is lost.\n",x);
        tot=cnt;
    }
    if(num>=n) cout<<"Game Over."<<endl;
    return 0;
}

7-8 愿天下有情人都是失散多年的兄妹 (25 分)

题目链接

答案

#include <iostream>
#include<bits/stdc++.h>
#define PII pair<int,int>
#define mem(a,b) memset(a,b,sizeof(a))
const int N = 1e5 + 10;
using namespace std;

struct node{
//    int id;
    int sex;
    int fid=-1;
    int mid=-1;
}dp[N];

bool vis[N];
bool flag;

void DFS(int id,int tot){
    if(id==-1) return ;
    if(tot>5) return ;
    vis[id]=1;
    DFS(dp[id].fid,tot+1);
    DFS(dp[id].mid,tot+1);
}

void judge(int id,int tot){
    if(id==-1) return ;
    if(tot>5) return ;
    if(vis[id]){
        flag=1;
        return ;
    }
    judge(dp[id].fid,tot+1);
    judge(dp[id].mid,tot+1);
}

int main(){
    int n;
    cin>>n;
    for(int i=1;i<=n;i++){
        int id;
        string s;
        cin>>id>>s;
        if(s=="M") dp[id].sex=1;
        else dp[id].sex=-1;
        cin>>dp[id].fid>>dp[id].mid;
        dp[dp[id].fid].sex=1;
        dp[dp[id].mid].sex=-1;
    }
    int q;
    cin>>q;
    while(q--){
        int x,y;
        cin>>x>>y;
        if(dp[x].sex==dp[y].sex) cout<<"Never Mind"<<endl;
        else{
            mem(vis,0);
            DFS(x,1);
            flag=0;
            judge(y,1);
            if(flag) cout<<"No"<<endl;
            else cout<<"Yes"<<endl;
        }
    }
    return 0;
}

7-9 家庭房产 (25 分)

题目链接

答案

#include <iostream>
#include<bits/stdc++.h>
#define ll long long
#define ull unsigned long long
#define INF 0x3f3f3f3f
#define inf 0x3f3f3f3f3f3f3f3f
#define mem(a,b) memset(a,b,sizeof(a))
#define rep(i,a,b) for(auto i=a;i<=b;++i)
#define bep(i,a,b) for(auto i=a;i>=b;--i)
#define lowbit(x) x&(-x)
#define PII pair<int,int>
#define PLL pair<ll,ll>
#define PI acos(-1)
#define pb push_back
#define eps 1e-8
#define x first
#define y second
const int mod = 1e9 + 7;
const int MOD = 1e4+7;
const int N = 1e5 + 10;
const int M = 555;
int dx[]={-1, 0, 1, 0};
int dy[]={0, 1, 0, -1};
int dxy[][2]={{0,1},{1,0},{1,1},{-1,1}};
using namespace std;

struct data{
    int id;
    int fa;
    int mo;
    int num;
    int area;
    int cp[M];
}dp[N];

struct node{
    int id;
    int peo;
    double num;
    double area;
    bool flag=0;
}mp[N];

int fat[N];
bool vis[N];

int Find(int x){
    if(fat[x]!=x) fat[x]=Find(fat[x]);
    return fat[x];
}

//int Find(int x){
//    while(x!=fat[x]) x=fat[x];
//    return x;
//}

void Merge(int u,int v){
    int x=Find(u);
    int y=Find(v);
    if(x>y) fat[x]=y;
    else if(x<y) fat[y]=x;
}

bool cmp(node x,node y){
    if(x.area!=y.area) return x.area>y.area;
    else return x.id<y.id;
}

void init(int n){
    rep(i,0,10000) fat[i]=i;
}

void solve(){
    int n;
    int k;
    int tot=0;
    cin>>n;
    init(n);
    rep(i,0,n-1){
        cin>>dp[i].id>>dp[i].fa>>dp[i].mo>>k;
        vis[dp[i].id]=1;
        if(dp[i].fa!=-1){
            vis[dp[i].fa]=1;
            Merge(dp[i].fa,dp[i].id);
        }
        if(dp[i].mo!=-1){
            vis[dp[i].mo]=1;
            Merge(dp[i].mo,dp[i].id);
        }
        rep(j,0,k-1){
            cin>>dp[i].cp[j];
            vis[dp[i].cp[j]]=1;
            Merge(dp[i].cp[j],dp[i].id);
        }
        cin>>dp[i].num>>dp[i].area;
    }
    rep(i,0,n-1){
        int id=Find(dp[i].id);
        mp[id].id=id;
        mp[id].num+=dp[i].num;
        mp[id].area+=dp[i].area;
        mp[id].flag=1;
    }
    rep(i,0,10000){
        if(vis[i]) mp[Find(i)].peo++;
        if(mp[i].flag) tot++;
    }
    rep(i,0,10000){
        if(mp[i].flag){
            mp[i].num=(double)(mp[i].num*1.0/mp[i].peo);
            mp[i].area=(double)(mp[i].area*1.0/mp[i].peo);
        }
    }
    sort(mp,mp+10000,cmp);
    cout<<tot<<endl;
    rep(i,0,tot-1){
        printf("%04d %d %.3f %.3f\n",mp[i].id,mp[i].peo,mp[i].num,mp[i].area);
    }
}

int main() {
    ios::sync_with_stdio(0);
    cin.tie(0);
    cout.tie(0);
    solve();
	return 0;
}



7-10 功夫传人 (25 分)

题目链接

答案

#include <iostream>
#include<bits/stdc++.h>
#define ll long long
#define PII pair<int,int>
#define pb push_back

const int N = 1e5 + 10;
using namespace std;

struct node{
    double w;
    int k;
    vector<int>vp;
}dp[N];

int n;
double z,r;
double sum;

void DFS(int x){
//    cout<<x<<" "<<"***"<<endl;
    if(!dp[x].vp.size()){
        dp[x].w*=dp[x].k;
//        cout<<x<<" "<<dp[x].w<<endl;
        sum+=dp[x].w;
        return ;
    }
//    if(x>=n) return ;
    for(int i=0;i<(int)dp[x].vp.size();i++){
        int j=dp[x].vp[i];
        dp[j].w=dp[x].w*1.0*(100-r)/100;
        DFS(j);
    }
}

void solve(){
    cin>>n>>z>>r;
    for(int i=0;i<n;i++){
        int k;
        cin>>k;
        if(!k){
            cin>>k;
            dp[i].k=k;
        }
        else{
            while(k--){
                int x;
                cin>>x;
                dp[i].vp.pb(x);
    //            dp[x].pre=i;
            }
        }
    }
//    cout<<"***"<<endl;
    dp[0].w=z;
    DFS(0);
    cout<<(int)sum<<endl;
}

int main()
{
    solve();
    return 0;
}


7-11 图着色问题 (25 分)

题目链接

答案

#include<bits/stdc++.h>
#define INF 0x3f3f3f3f
const int N = 1e4 + 10;
using namespace std;

int v,e,k;
int mp[N][N];
int col[N];
bool vis[N];
bool vp[N];
bool flag;

void DFS(int u){
    vis[u]=1;
    vp[u]=1;
    for(int i=1;i<=v;i++){
        if(mp[u][i]){
            if(col[i]==col[u]){
                flag=1;
                break;
            }
            if(!vis[i]) DFS(i);
        }
    }
//    vis[u]=0;
}

int main(){
    cin>>v>>e>>k;
    while(e--){
        int u,v;
        cin>>u>>v;
        mp[u][v]=mp[v][u]=1;
    }
    int q;
    cin>>q;
    while(q--){
        set<int>st;
        memset(vis,0,sizeof(vis));
        memset(vp,0,sizeof(vp));
        for(int i=1;i<=v;i++){
            cin>>col[i];
            st.insert(col[i]);
        }
        if((int)st.size()!=k){
            puts("No");
            continue;
        }
        flag=0;
//        for(int i=1;i<=v;i++) BFS(i);
        for(int i=1;i<=v;i++) if(!vp[i]&&!flag) DFS(i);
        if(!flag) puts("Yes");
        else puts("No");
    }
    return 0;
}

7-12 拯救007 (25 分)

题目链接

答案

#include <iostream>
#include<bits/stdc++.h>
#define ll long long
#define PII pair<int,int>
#define pb push_back
const int N = 1e5 + 10;
using namespace std;

struct node{
    int x;
    int y;
}dp[N];

int n,d;
bool vis[N];
bool flag;

bool fp(int x){
    int px=pow(dp[x].x,2);
    int py=pow(dp[x].y,2);
    int r=(d+7.5)*(d+7.5);
    if(px+py<=r) return 1;
    return 0;
}

bool jump(int x,int y){ ///判断是否可以跳到另一个鳄鱼头
    int px=pow(dp[x].x-dp[y].x,2);
    int py=pow(dp[x].y-dp[y].y,2);
    int r=d*d;
    if(px+py<=r) return 1;
    return 0;
}

bool judge(int x){  ///判断是否可以到达岸边
    if((dp[x].x-d<=-50)||(dp[x].x+d>=50)||(dp[x].y-d<=-50)||(dp[x].y+d>=50)) return 1;
    return 0;
}

bool DFS(int x){
    vis[x]=1;
    if(judge(x)) flag=1;
    for(int i=0;i<n;i++){
        if(!vis[i]&&jump(x,i)){
            flag=DFS(i);
        }
    }
    return flag;
}

void solve(){
    memset(vis,0,sizeof(vis));
    cin>>n>>d;
    for(int i=0;i<n;i++){
        cin>>dp[i].x>>dp[i].y;
    }
    if(d>=42.5) puts("Yes");
    else{
        for(int i=0;i<n;i++){
            if(!vis[i]&&fp(i)){
                DFS(i);
            }
        }
        if(flag) puts("Yes");
        else puts("No");
    }
}

int main()
{
    solve();
    return 0;
}


测试点样例打表(学弟发现 tql):

#include<bits/stdc++.h>
#define INF 0x3f3f3f3f
const int N = 1e4 + 10;
using namespace std;

int main(){
    int a,b;
    cin>>a>>b;
    if(a==4||a==100||a==5) puts("No");
    else puts("Yes");
    return 0;
}

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值