题意很纠结,还有找对应关系,我已开始用c去对应r,看cou是否等于c,这就错了,题意说每一行必须射一点,所以应该r去对应c,看cou是否=r
#include<iostream>
using namespace std;
int r,c;
int map[1005][1005],vis[1005],pa[1005],ans[1005];
int find(int x)
{
for(int i=1;i<=c;i++)
{
if(map[x][i]&&!vis[i])
{
vis[i]=1;
if(pa[i]==-1||find(pa[i]))
{
pa[i]=x;
return 1;
}
}
}
return 0;
}
int main()
{
int ca,x,y;
while(cin>>ca)
{
while(ca--)
{
cin>>r>>c;
for(int i=0;i<=1001;i++)
{
for(int j=0;j<=1001;j++)
map[i][j]=0;
pa[i]=-1;
}
for(int i=1;i<=c;i++)
{
scanf("%d%d",&x,&y);
map[x][i]=1;
map[y][i]=1;
}
if(c<r)//当r>c时,cou不可能等于r也就是说不是所有行都可以被射到,所以不符合要求,直接输出no
{
printf("NO\n");
continue;
}
int cou=0;
for(int i=1;i<=r;i++)
{
memset(vis,0,sizeof(vis));
if(find(i))
cou++;
}
if(cou==r)
{
for(int i=1;i<=c;i++) //这时候每一行都被射到过,可能存在列没有被射到,可以再该列中任意选一个格子
{
if(pa[i]!=-1)
{
if(i<c)
printf("%d ",pa[i]);
else
printf("%d\n",pa[i]);
}
else
{
for(int j=1;j<=r;j++)
{
if(map[j][i]==1)
{
if(i<c)
printf("%d ",j);
else
printf("%d\n",j);
break;
}
}
}
}
}
else
printf("NO\n");
}
}
return 0;
}