暑假做的,有些东西可能忘了。
===========
poj 1719 Shooting Contest
二分图第一题,对着模板写的,忘了注释freopen,wa了一次
#include <iostream>
#include <cstdio>
#include <vector>
#include <cstring>
using namespace std;
const int N=1005;
vector<int>lx[N],ly[N];
int linky[N],vis[N];
int r, c;
int can(int t)
{
for(int i=0,e=lx[t].size(); i<e; i++)
{
int j=lx[t][i];
if(!vis[j])
{
vis[j]=1;
if(!linky[j]||can(linky[j]))
{
linky[j]=t;
return 1;
}
}
}
return 0;
}
int maxmatch()
{
int cnt=0;
for(int i=1; i<=r; i++)
{
memset(vis,0,sizeof(vis));
if(can(i))
cnt++;
else
return 0;
}
return cnt;
}
void init()
{
int u,v;
scanf("%d%d",&r,&c);
for(int i=1; i<=r; i++)
lx[i].clear();
for(int i=1; i<=c; i++)
{
ly[i].clear();
scanf("%d%d",&u,&v);
lx[u].push_back(i);
lx[v].push_back(i);
ly[i].push_back(u);
ly[i].push_back(v);
}
memset(linky,0,sizeof(linky));
}
int main()
{
freopen("in","r",stdin);
int T;
scanf("%d",&T);
while(T--)
{
init();
if(maxmatch()==r)
{
for(int i=1;i<=c;i++)
if(linky[i])
printf(i==c?"%d\n":"%d ",linky[i]);
else
printf(i==c?"%d\n":"%d ",ly[i][0]);
}
else
printf("NO\n");
}
return 0;
}
poj2446 Chessboard
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
const int used=1;
typedef pair<int,int> PII;
#define MP(x,y) make_pair(x,y)
#define X first
#define Y second
const int N=35;
int mat[N][N];
int n,m;
PII linky[N][N];
inline void read()
{
memset(linky,0,sizeof(linky));
memset(mat,0,sizeof(mat));
int k,x,y;
scanf("%d",&k);
while(k--)
{
scanf("%d%d",&x,&y);
x--;
y--;
mat[y][x]=-1;
}
}
int move[4][2]={{-1,0},{1,0},{0,-1},{0,1} };
bool invalid(PII a){return a.X<0||a.X>=n||a.Y<0||a.Y>=m||mat[a.X][a.Y]==-1;}
bool vis[N][N];
bool can(PII cur)
{
PII next;
for(int i=0;i<4;i++)
{
next.X=cur.X+move[i][0];
next.Y=cur.Y+move[i][1];
if(invalid(next)||vis[next.X][next.Y])
continue;
vis[next.X][next.Y]=1;
if(!mat[next.X][next.Y]||can(linky[next.X][next.Y]))
{
linky[next.X][next.Y]=cur;
linky[cur.X][cur.Y]=next;
mat[next.X][next.Y]=used;
return true;
}
}
return false;
}
void debug(int x,int y)
{
cout<<x<<" "<<y<<endl;
for(int i=0;i<n;i++)
{
for(int j=0;j<m;j++)
printf("%d ",mat[i][j]);
puts("");
}
puts("");
for(int i=0;i<n;i++)
{
for(int j=0;j<m;j++)
printf("%d %d| ",linky[i][j].X,linky[i][j].Y);
puts("");
}
puts("");
}
inline bool solve()
{
for(int i=0;i<n;i++)
for(int j=0;j<m;j++)
{
if(mat[i][j])
continue;
memset(vis,0,sizeof(vis));
if(!can(MP(i,j)))
{return false;}
mat[i][j]=used;
}
return true;
}
int main()
{
// freopen("in","r",stdin);
while(~scanf("%d%d",&n,&m))
{
read();
if(solve())
puts("YES");
else
puts("NO");
}
return 0;
}