每一个asteroid都可以从行或列的角度来击碎,因此把asteroid当成边,row和column当成点,可以构造出一个二分图。然后利用二分图中 最小点覆盖=最大二分匹配 来解答。 #include <iostream> using namespace std; bool map[505][505]; bool visited[505]; int pre[505]; int N,K; bool Find_DFS(int left) { for(int i=0;i<N;i++) { if(map[left][i]&&!visited[i]) { visited[i]=true; if(pre[i]==-1||Find_DFS(pre[i])) { pre[i]=left; return true; } } } return false; } int main() { int row,column,ans=0; scanf("%d%d",&N,&K); memset(map,0,sizeof(map)); memset(pre,-1,sizeof(pre)); for(int i=0;i<K;i++) { scanf("%d%d",&row,&column); map[row-1][column-1]=true; } for(int i=0;i<N;i++) { memset(visited,0,sizeof(visited)); if(Find_DFS(i)) ans++; } printf("%d\n",ans); return 0; }