【poj 3687 Labeling Balls 】(拓扑排序+优先队列,构造反向图)
2018-02-02 13:30
399 查看
题意:n个重量为1~n的球,给定一些编号间的重量比较关系,前者比后者轻,现在给每个球编号,在符合条件的前提下使得编号小的球重量小。(先保证1号球最轻,其次2号……)
分析:要保证1号球最轻,2号其次, 如果有多个入度为0的点,我们必须把编号从大到小分配给他们,这样才满足题目条件。 所以要构造反向图。
并且 要判重。
代码:
分析:要保证1号球最轻,2号其次, 如果有多个入度为0的点,我们必须把编号从大到小分配给他们,这样才满足题目条件。 所以要构造反向图。
并且 要判重。
代码:
#include <cstdio> #include <iostream> #include <cstring> #include <map> #include <set> #include <bitset> #include <cctype> #include <cstdlib> #include <queue> #include <cmath> #include <stack> #include <ctime> #include <string> #include <vector> #include <sstream> #include <algorithm> using namespace std; #define mem(a,n) memset(a,n,sizeof(a)) #define memc(a,b) memcpy(a,b,sizeof(b)) #define rep(i,a,n) for(int i=a;i<n;i++) #define pb push_back #define IO ios::sync_with_stdio(false) #define fre freopen("in.txt","r",stdin) #define lson l,m,rt<<1 #define rson m+1,r,rt<<1|1 typedef long long ll; const double PI=acos(-1.0); const double eps=1e-8; const int INF=0x3f3f3f3f; const int MOD=1e8; const int N=2e2+5; const ll maxn=1LL<<60; const int dir[4][2]= {-1,0,1,0,0,-1,0,1}; int n,m; //vector<int>g ; bool g ; int ans ; int deg ,num; void init() { num=0; mem(deg,0); mem(g,0); //rep(i,0,n+1) g[i].clear(); } bool toposort() { priority_queue<int>que;///大顶堆 rep(i,1,n+1) if(!deg[i]) que.push(i); int tmp=n; while(!que.empty()) { int u=que.top(); que.pop(); ans[u]=tmp--; rep(i,1,n+1) { if(!g[u][i]) continue; g[u][i]=0; deg[i]--; if(!deg[i]) que.push(i); } } return tmp==0; } int main() { //fre; IO; int T; cin>>T; while(T--) { cin>>n>>m; init(); rep(i,0,m) { int u,v; cin>>u>>v; if(!g[v][u])///判重 { g[v][u]=1;////构造反向图 deg[u]++; } } if(!toposort()) cout<<-1<<endl; else { rep(i,1,n+1) cout<<ans[i]<<" "; cout<<endl; } } return 0; }
相关文章推荐
- POJ3687——Labeling Balls(反向建图+拓扑排序)
- poj 3687 Labeling Balls【反向拓扑】
- [ACM] POJ 3687 Labeling Balls (拓扑排序,反向生成端)
- poj 3687 Labeling Balls【反向拓扑】
- poj-3687-Labeling Balls-反向建图+拓扑排序
- POJ 3687 Labeling Balls (反向拓扑排序)
- POJ 3687 Labeling Balls(拓扑排序+反向思考)
- POJ 3687 Labeling Balls (反向拓扑排序)
- [POJ] 3687 Labeling Balls(拓扑排序)
- POJ 3687 Labeling Balls
- poj 3687 Labeling Balls 【拓扑排序】
- [ACM] POJ 3687 Labeling Balls (拓扑排序,逆向建边)
- POJ 3687 Labeling Balls 拓扑排序
- POJ 3687 Labeling Balls (逆向拓扑排序)
- **poj 3687 Labeling Balls (*拓扑排序)
- poj3687——Labeling Balls(拓扑排序)
- poj_3687 Labeling Balls
- poj 3687 Labeling Balls
- poj 3687 Labeling Balls ( 拓扑排序 )
- POJ 3687 Labeling Balls 逆向建图,拓扑排序