Labeling Balls poj-3687
题目大意:给出一些球之间的大小关系,求在满足这样的关系下,编号小的尽量比编号大的球的方案。
注释:1<=N(球的个数)<=200,1<=M(题目给出的关系数)<=40000.
想法:和poj1094几乎相同,只不过我们需要在编号上做一些手脚。其实就是从重者想轻者连边即可。然后我们用数组循环实现toposort,方便我们判环。挺细节的一道题。
最后,附上丑陋的代码... ...
#include <iostream> #include <string> #include <cstring> #include <cmath> #define M 210 using namespace std; int in[M],map[M][M],ans[M],flag; void topsort(int n) { int k=n; while(k>=1) { int mid=0; for(int i=n;i>=1;i--) { if(in[i]==0) { for(int j=1;j<=n;j++) if(map[i][j]==1) in[j]--; in[i]--; ans[i]=k--; mid=i; break; } } if(mid==0) { flag=0; break; } } } void original() { memset(map,0,sizeof map); memset(in,0,sizeof in); flag=1; } int main() { int cases,n,m,a,b; cin>>cases; while(cases--) { original(); scanf("%d%d",&n,&m); for(int i=0;i<m;i++) { scanf("%d%d",&a,&b); if(a!=b) { if(map[b][a]==0) { map[b][a]=1; in[a]++; } } else flag=0; } if(flag) { topsort(n); if(flag==0) { printf("-1 ");continue; } for(int i=1;i<=n;i++) printf("%d ",ans[i]); cout<<endl; } else printf("-1 "); } }
小结:OI的路还有很长,toposort裸题就先告一段落。因为植物大战僵尸而学习的新知识点,蛮有意思的。