PAT 1166 Summit

    技术2025-09-14  36

    原题链接:PAT 1166 Summit (25分) 关键词:图

    A summit (峰会) is a meeting of heads of state or government. Arranging the rest areas for the summit is not a simple job. The ideal arrangement of one area is to invite those heads so that everyone is a direct friend of everyone.

    Now given a set of tentative arrangements, your job is to tell the organizers whether or not each area is all set.

    Input Specification:

    Each input file contains one test case. For each case, the first line gives two positive integers N (≤ 200), the number of heads in the summit, and M, the number of friendship relations. Then M lines follow, each gives a pair of indices of the heads who are friends to each other. The heads are indexed from 1 to N.

    Then there is another positive integer K (≤ 100), and K lines of tentative arrangement of rest areas follow, each first gives a positive number L (≤ N), then followed by a sequence of L distinct indices of the heads. All the numbers in a line are separated by a space.

    Output Specification:

    For each of the K areas, print in a line your advice in the following format:

    if in this area everyone is a direct friend of everyone, and no friend is missing (that is, no one else is a direct friend of everyone in this area), print Area X is OK…

    if in this area everyone is a direct friend of everyone, yet there are some other heads who may also be invited without breaking the ideal arrangement, print Area X may invite more people, such as H. where H is the smallest index of the head who may be invited.

    if in this area the arrangement is not an ideal one, then print Area X needs help. so the host can provide some special service to help the heads get to know each other.

    Here X is the index of an area, starting from 1 to K.

    Sample Input:

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

    Sample Output:

    Area 1 is OK. Area 2 is OK. Area 3 is OK. Area 4 is OK. Area 5 may invite more people, such as 3. Area 6 needs help.

    题目大意: 给出n个顶点,m条边,k个询问。每个询问中包含l个顶点,问你这l个顶点是否两两相连,如果是,能否再找到一个点满足它与这l个点都相连。 思路: 用邻接矩阵存储图,暴力来做。

    代码:

    #include<bits/stdc++.h> using namespace std; const int maxn = 210; int g[maxn][maxn]; int a[maxn]; int v[maxn]; int n,m; int main(){ cin>>n>>m; memset(g, 0, sizeof(g)); for(int i = 1; i <= m; i++){ int a, b; cin >> a >> b; g[a][b] = g[b][a] = 1;//邻接矩阵存储 } int k; cin >> k; int l; for(int i = 1; i <= k; i++){ //k个询问 cin >> l; memset(v, 0, sizeof(v)); //v来标记所询问的l个点 for(int j = 1; j <= l; j++) { cin >> a[j]; v[a[j]] = 1;//做上标记 } bool flag = 1;//是不是两两相连 for(int j = 1; j <= l; j++){ for(int p = j+1; p <= l; p++){ if(g[a[j]][a[p]] != 1) flag = 0; break; } } if(!flag) cout<<"Area "<<i<<" needs help."; else{ //如果是两两相连 int ans = -1; //可能存在的点 for(int j = 1; j <= n; j++){//查询存不存在一个点与这l个点都相连 if(v[j]) continue;//本身是l个点里的不算 bool flag2 = 1; for(int p = 1; p<=l; p++){ if(g[a[p]][j] != 1){ flag2 = 0; break; } } if(flag2) { ans=j;//存在 break; } } if(ans!=-1){//存在 cout<<"Area "<<i<<" may invite more people, such as "<<ans<<"."; }else{//不存在 cout<<"Area "<<i<<" is OK."; } } if(i!=k) cout << endl;//行末无空行 } return 0; }
    Processed: 0.011, SQL: 9