【PTA】L2-025分割統治(25点)(隣接リスト)

分割統治法は、それぞれの突破口が軍事戦略家によって一般的に使用される戦略の1つです。戦争では、まず敵の都市のいくつかを占領し、残りの都市を孤立させて無力にし、次にそれらを別々に破壊したいと考えています。この目的のために、スタッフは多くの戦闘プログラムを提供しました。この質問では、各スキームの実現可能性を判断するためのプログラムを作成するように求められます。

入力形式:
最初の行に2つの正の整数NとM(どちらも10,000を超えない)を入力します。これは、敵の都市の数(デフォルトの都市の番号は1からN)と2つの都市を結ぶ道路の数です。M行に続いて、各行は、スペースで区切られた、パスで接続された2つの都市の番号を示します。都市情報の後に、スタッフの一連の計画、つまり正の整数K(≤100)と次のK線計画が与えられ、各線は次の形式で与えられます。

Np v [1] v [2]…v [Np]
ここで、Npはスキームでキャプチャされる予定の都市の数であり、次のシリーズv [i]はキャプチャされる予定の都市の数です。

出力形式:
ソリューションのセットごとに、可能であればYESを出力し、それ以外の場合はNOを出力します。

入力サンプル:

10 11
8 7
6 8
4 5
8 4
8 1
1 2
1 4
9 8
9 1
1 10
2 4
5
4 10 3 8 4
6 6 1 7 5 4 9
3 1 8 4
2 2 8
7 9 8 7 6 5 4 2

サンプル出力:

NO
YES
YES
NO
NO

コード:

#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;
typedef long long ll;
const int maxn=10050;
int n,m,a,b,k,p,link[maxn]={
    
    0},t[maxn]={
    
    0},del;
vector<int> g[maxn];

int main()
{
    
    
	cin>>n>>m;
	for(int i=0;i<m;i++)
	{
    
    
		cin>>a>>b;
		link[a]++; //与a连接的城市数
		link[b]++;
		g[a].push_back(b); //无向图,与a连接的城市编号
		g[b].push_back(a);
	}
	
	cin>>k;
	for(int i=0;i<k;i++)
	{
    
    
		memset(t,0,sizeof(t));
		for(int j=1;j<=n;j++) //临时的link
			t[j]=link[j];
		
		cin>>p;
		for(int j=0;j<p;j++)
		{
    
    
			cin>>del;
			t[del]=0;
			for(int x=0;x<g[del].size();x++) //出度
				t[g[del][x]]--;
		}
		
		int flag=0;
		for(int i=1;i<=n;i++) //如果还有相连的城市,则输出no
		{
    
    
			if(t[i]>0) 
			{
    
    
				flag=1;
				break;
			}
		}
		if(flag) cout<<"NO"<<endl;
		else cout<<"YES"<<endl;
	}
   	return 0;
}

おすすめ

転載: blog.csdn.net/weixin_45260385/article/details/109751136