题意:给你n*n个组数,要在n*n的格子里面,每个交点铺沥青,每组数有两个数值一个为行标一个为列标,问你在这n*n个组数中,在满足所有的行和列都填上要在哪几个工人处铺路,最后将工人按升序输出、
思路:直接标记,如果当前行和列没有被标记那么选择当前工人、最后直接输出便可、
AC代码:
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int maxn = 2510;
int vis[maxn];
int viz[maxn];
int b[maxn];
int x,y;
int n;
int main()
{
while(scanf("%d",&n)!=EOF){
memset(vis,0,sizeof(vis));
memset(viz,0,sizeof(viz));
memset(b,0,sizeof(b));
int ans=0;
for(int i=0;i<n*n;i++){
scanf("%d %d",&x,&y);
if(!vis[x]&&!viz[y]){
vis[x]=1;
viz[y]=1;
b[ans++]=i+1;
}
}
printf("%d",b[0]);
for(int i=1;i<ans;i++)
printf(" %d",b[i]);
printf("\n");
}
return 0;
}