ZOJ3321
//there is at most one edge between two nodes.
因为这句话的局限性,又要满足环,那么一定是每个点度为2,然后为n节点的一个环
//#include <bits/stdc++.h>
#include<cstdio>
#include<string.h>
#include<algorithm>
using namespace std;
typedef long long LL;
//there is at most one edge between two nodes.
const int N=20;
int ma[N][N],n,m,out[N];
bool flag,vis[N];
void DFS(int u,int num)
{
if(flag)
return;
for(int i=1;i<=n;i++)
{
if(ma[u][i]&&num==n&&i==1)
{
flag=true;
return;
}
if(ma[u][i]&&!vis[i])
{
vis[i]=true;
DFS(i,num+1);
}
}
}
int main()
{
while(~scanf("%d%d",&n,&m))
{
int u,v;
memset(ma,0,sizeof(ma));
memset(out,0,sizeof(out));
while(m--)
{
scanf("%d%d",&u,&v);
ma[u][v]=ma[v][u]=1;
out[u]++;
out[v]++;
}
bool ff=true;
for(int i=1;i<=n;i++)
{
if(out[i]!=2)
{
ff=false;
break;
}
}
if(!ff)
{
puts("NO");
continue;
}
memset(vis,false,sizeof(vis));
flag=false;
vis[1]=true;
DFS(1,1);
if(flag)
puts("YES");
else
puts("NO");
}
return 0;
}
ZOJ3317
题意:
租的人,房子数量。
n行进入时间,出去时间。
每次进入有房间则给一个房间,按房间编号从小到大租出。
求每个进入的人的房间号。
思路:
离线处理。
先把每个人按照进入时间排序,每次从小到大枚举m个房间有没有人居住。
//#include <bits/stdc++.h>
#include<cstdio>
#include<string.h>
#include<algorithm>
using namespace std;
typedef long long LL;
const int N=1e2+10;
struct asd{
int u,v;
int id;
};
asd q[N];
int n,m,ans[N];
bool cmp(asd x,asd y)
{
if(x.u==y.u)
return x.id<y.id;
return x.u<y.u;
}
int main()
{
while(~scanf("%d%d",&n,&m))
{
if(!n&&!m) break;
int u,v;
bool flag;
for(int i=1;i<=n;i++)
{
scanf("%d%d",&u,&v);
q[i].id=i;
q[i].u=u;
q[i].v=v;
}
sort(q+1,q+n+1,cmp);
memset(ans,0,sizeof(ans));
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
{
flag=true;
for(int k=1;k<i;k++){
if(ans[q[k].id]==j && q[k].v>q[i].u){
flag=false;break;
}
}
if(flag)
{
ans[q[i].id]=j;
break;
}
}
}
for(int i=1;i<=n;i++)
printf("%d\n",ans[i]);
}
return 0;
}