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 ",ans[i]); } return 0; }