2 条题解
-
2
模拟几种可能的路线组合后,我们可以发现所有路线可以分成两种类型:
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
- 上传者