2 条题解

  • 2
    @ 2025-10-26 22:17:43

    模拟几种可能的路线组合后,我们可以发现所有路线可以分成两种类型:

    1.这个路线会经过其他路线都不能经过的城市,也就是必须选择的路线。

    2.这个路线会经过的所有城市也可以在其他路线中被经过,所以这个路线是可以被其他路线替代的。

    那么这m个路线我们减去第一种必须选择的路线,剩下的路线可以相互代替,组合。并且两条路线就能构成三种不同的路线组合,分别为[1],[2],[1,2].

    那我们的核心策略就是找到必须选择的路线并减去,判断剩下的路线是否大于2就可以了。

    如果有个城市不被任何路线经过,那么直接输出No并结束程序即可

    #include<bits/stdc++.h>
    using namespace std;
    #define LL long long
    #define pii pair<int,int>
    #define pu push_back
    
    LL mod=1;
    void babason(){
        int n,m;cin>>n>>m;
        vector<int> a(m+1);//代表每条路线经过的城市数量
        for(int i=1;i<=m;i++){
            cin>>a[i];
        }
        vector<vector<int>> b(m+1,vector<int>(n+1));//表示第i条路线会经过的第j个城市
        vector<int> num_line(n+1,0);//表示第i个城市,会被多少条路线经过
        
        for(int i=1;i<=m;i++){//一边输入路线会经过的城市,一边累加这个城市被不同路线经过的次数
            for(int j=1;j<=a[i];j++){
                cin>>b[i][j];
                num_line[b[i][j]]++;    
            }
        }
    
        for(int i=1;i<=n;i++){//如果有一个城市不能被任意条路线经过,那么就输出NO并结束程序
            if(num_line[i]==0){
                cout<<"NO";return;
            }
        }
        
        int num_n=m;//表示一共有m条路线
        
        for(int i=1;i<=m;i++){
            for(int j=1;j<=a[i];j++){
                if(num_line[b[i][j]]==1){//如果这条路线经过的城市num_line为1,那么这条路线一定属于第一种,需要从num_n中减去
                    num_n--;
                    break;
                }
            }
        }
        
        if(num_n>=2){//判断并输出
            cout<<"YES\n";
        }
        else {
            cout<<"NO";
        }
    }
    
    int main(){
        cin.tie(0);
        cout.tie(0);
        ios::sync_with_stdio(0);
        //int t;cin>>t;while(t--)
        babason();
        return 0;
    }
    

    信息

    ID
    1111
    时间
    1000ms
    内存
    256MiB
    难度
    10
    标签
    递交数
    55
    已通过
    1
    上传者