一、题目概述
依据给定的货物互斥关系,判断给定的M个货物清单是否合法。
二、思路
以无向图存储货物的互斥关系。对每个待检测货物清单中的货物,标记出其互斥的货物,如在清单中则不是一个合法清单。
三、代码
#include <cstdio>
#include <vector>
#include <algorithm>
using namespace std;
vector<int> visited(2001, 0), G[2001], ans;
int cnt;
void dfs( int v )
{
visited[v] = 1;
if( v > 1000 )
++cnt;
for( int i = 0; i < G[v].size(); ++i )
if( !visited[ G[v][i] ] )
dfs(G[v][i]);
}
int main()
{
int N;
scanf("%d", &N);
for( int i = 1, K; i <= N; ++i )
{
scanf("%d: ", &K);
for( int j = 0, node; j < K; ++j )
{
scanf("%d", &node);
G[1000 + i].push_back(node);
G[node].push_back(1000 + i);
}
}
for( int i = 1; i <= N; ++i )
{
if( !visited[1000 + i] )
{
cnt = 0;
dfs(1000 + i);
ans.push_back(cnt);
}
}
sort( ans.begin(), ans.end(), [](int a, int b){ return a > b; } );
printf("%d\n", ans.size());
for( int i = 0; i < ans.size(); ++i )
printf("%s%d", i ? " ":"", ans[i]);
}