HDU3231Box Relations
2016-04-10 17:21
246 查看
题目
http://acm.hdu.edu.cn/showproblem.php?pid=3231第一想法就是拓扑排序,想了一想,发现并不难
代码
#include<iostream> #include<cstdio> #include<cstring> #include<vector> #include<algorithm> #include<queue> #ifdef L_JUDGE #pragma warning(disable:4996) #endif using namespace std; #define MAXN 1010 #define MAXE 2020 int inx[MAXE], iny[MAXE], inz[MAXE]; int rex[MAXE], rey[MAXE], rez[MAXE]; vector<int> mx[MAXE], my[MAXE], mz[MAXE]; int N, R; void init(){ memset(inx, 0, sizeof(inx)); memset(iny, 0, sizeof(iny)); memset(inz, 0, sizeof(inz)); for(int i=2*N;i>=1;i--){ mx[i].clear(); my[i].clear(); mz[i].clear(); } } bool solve(int in[], vector<int> map[], int ans[]){ queue<int> qe; int maxi=2*N; for(int i=1;i<=maxi;i++){ if(in[i]==0){ qe.push(i); } } int num=0; while(!qe.empty()){ int tp=qe.front(); qe.pop(); ans[tp]=num++; int maxi=map[tp].size()-1; for(int i=0;i<=maxi;i++){ int temp=map[tp][i]; in[temp]--; if(0==in[temp]){ qe.push(temp); } } } if(num==2*N)return true; else return false; } int main(){ #ifdef L_JUDGE freopen("in.txt","r",stdin); freopen("out.txt","w",stdout); #endif int casei=1; while(scanf("%d%d", &N, &R), N+R){ init(); for(int ni=1;ni<=N;ni++){ inx[ni+N]++; iny[ni+N]++; inz[ni+N]++; mx[ni].push_back(ni+N); my[ni].push_back(ni+N); mz[ni].push_back(ni+N); } char s[5]; int a, b; for(int ni=1;ni<=R;ni++){ scanf("%s%d%d", s, &a, &b); switch(s[0]){ case 'I': inx[b+N]++; inx[a+N]++; mx[a].push_back(b+N); mx[b].push_back(a+N); iny[b+N]++; iny[a+N]++; my[a].push_back(b+N); my[b].push_back(a+N); inz[b+N]++; inz[a+N]++; mz[a].push_back(b+N); mz[b].push_back(a+N); break; case 'X': inx[b]++; mx[a+N].push_back(b); break; case 'Y': iny[b]++; my[a+N].push_back(b); break; case 'Z': inz[b]++; mz[a+N].push_back(b); break; default: break; } } bool flag=true; if(!solve(inx, mx, rex))flag=false; if(!solve(iny, my, rey))flag=false; if(!solve(inz, mz, rez))flag=false; if(flag){ printf("Case %d: POSSIBLE\n", casei++); for(int i=1;i<=N;i++){ printf("%d %d %d %d %d %d\n", rex[i], rey[i], rez[i], rex[i+N], rey[i+N], rez[i+N] ); } }else{ printf("Case %d: IMPOSSIBLE\n", casei++); } printf("\n"); } #ifdef L_JUDGE fclose(stdin); fclose(stdout); system("out.txt"); #endif return 0; }
相关文章推荐
- 详解图的应用(最小生成树、拓扑排序、关键路径、最短路径)
- 初学图论-Kahn拓扑排序算法(Kahn's Topological Sort Algorithm)
- HDU 3342
- 2367:Genealogical tree
- hdu 1285 确定比赛名次 (简单的拓扑排序)
- hdu 2049 产生冠军(拓扑排序)
- [BZOJ2330][SCOI2011][拓扑排序][强连通分量][Tarjan]Candy
- Course Schedule
- LeetCode Course Schedule II
- 【Leetcode】Course Schedule II #210
- poj1094 拓扑排序
- (转)拓扑排序
- [leetcode]Course Schedule
- poj_1094
- cf_290(div2)A,B,C
- 图论算法(1)--- 如何求每一个节点在DAG中的最大深度
- hdu 3342 拓扑排序
- hdu 2647 拓扑排序
- UVa 1572 拓扑排序 判断有向图是否有环
- UVa10305拓扑排序入门题 可做模板用