poj 3687 Labeling Balls 初级 图 拓扑排序
2012-12-07 20:35
477 查看
Labeling Balls
当出度为0的点大于等于2时优先处理最小的那个编号(用优先队列);
按小球的升序编号输出其重量(挺阴的)。
当出度为0的点大于等于2时优先处理最小的那个编号(用优先队列);
按小球的升序编号输出其重量(挺阴的)。
#include<iostream> #include<cstdio> #include<cstring> #include<queue> #include<vector> using namespace std; int main() { int map[201][201],in[201]; vector<int> v[201]; priority_queue<int,vector<int>,less<int> > q; int t,n,m,a,b,i,j; int tp[201],tp1[201],pos,cou,flag; scanf("%d",&t); while(t--) { cou=1;flag=0; memset(map,0,sizeof(map)); memset(in,0,sizeof(in)); scanf("%d%d",&n,&m); for(j=0;j<=n;j++) v[j].clear(); for(i=1;i<=m;i++) { scanf("%d%d",&a,&b); if(a==b) flag=1; else { if(map[a][b]==0) { map[a][b]=1; v[b].push_back(a); in[a]++; } } } for(j=1;j<=n;j++) if(in[j]==0) q.push(j); while(!q.empty()) { pos=q.top(); tp[cou++]=pos; q.pop(); int size=v[pos].size(); for(j=0;j<size;j++) { int abc; abc=v[pos][j]; in[abc]--; if(in[abc]==0) q.push(abc); } } if(cou==n+1&&flag==0) { for(i=n;i>=1;i--) tp1[tp[i]]=n-i+1; for(i=1;i<n;i++) printf("%d ",tp1[i]); printf("%d",tp1 ); } else printf("-1"); if(t) printf("\n"); } return 0; }
相关文章推荐
- 【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【拓扑排序】
- [ACM] 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 (逆向拓扑排序)
- Labeling Balls(POJ 3687-逆序拓扑排序)
- POJ 3687 Labeling Balls (反向拓扑排序)