POJ 3684-Labeling Balls(反向拓撲排序-按條件排序輸出重量)
Time Limit: 1000MS | Memory Limit: 65536K | |
Total Submissions: 14408 | Accepted: 4213 |
Description
Windy has N balls of distinct weights from 1 unit to N units. Now he tries to label them with 1 to N in such a way that:
- No two balls share the same label.
- The labeling satisfies several constrains like "The ball labeled with a is lighter than the one labeled with b".
Can you help windy to find a solution?
Input
The first line of input is the number of test case. The first line of each test case contains two integers, N (1 ≤ N ≤ 200) and M (0 ≤ M ≤ 40,000). The next M line each contain two integers a and b indicating the ball labeled with a must be lighter than the one labeled with b. (1 ≤ a, b ≤ N) There is a blank line before each test case.
Output
For each test case output on a single line the balls' weights from label 1 to label N. If several solutions exist, you should output the one with the smallest weight for label 1, then with the smallest weight for label 2, then with the smallest weight for label 3 and so on... If no solution exists, output -1 instead.
Sample Input
5 4 0 4 1 1 1 4 2 1 2 2 1 4 1 2 1 4 1 3 2
Sample Output
1 2 3 4 -1 -1 2 1 3 4 1 3 2 4
Source
題目意思:
解題思路:
#include<cstdio>
#include<cstring>
#include<cmath>
#include<set>
#include<cstdlib>
#include<iostream>
#include<queue>
#include<algorithm>
using namespace std;
#define MAXN 100010
#define INF 0x3f3f3f3f
int n,m;
int indegree[MAXN];
vector<int> v[MAXN];
struct cmp
{
bool operator()(const int &a,const int &b)
{
return a<b;//從大到小
}
};
void Topsort()//拓撲排序
{
priority_queue<int,vector<int>,cmp> q;
int p[MAXN];
int ip=0;
memset(p,0,sizeof(p));
for(int i=0; i<n; i++)
if(indegree[i]==0)
q.push(i);
while(!q.empty())
{
int temp=q.top();
p[++ip]=temp;
q.pop();
for(int i=0; i<v[temp].size(); i++)
{
indegree[v[temp][i]]--;
if(indegree[v[temp][i]]==0)
q.push(v[temp][i]);
}
}
int ans[MAXN];
if(ip<n) printf("-1\n");
else
{
int cnt=1;
for(int i=ip; i>=1; --i)//重量大小應當逆向輸出
ans[p[i]+1]=cnt++;//記錄1~N的重量
for(int i=1; i<cnt-1; ++i)
printf("%d ",ans[i]);
printf("%d\n",ans[cnt-1]);
}
}
int main()
{
#ifdef ONLINE_JUDGE
#else
freopen("G:/cbx/read.txt","r",stdin);
//freopen("G:/cbx/out.txt","w",stdout);
#endif
int t;
scanf("%d",&t);
while(t--)
{
scanf("%d%d",&n,&m);
for(int i=0; i<=n; i++) v[i].clear();//注意初始化清空
memset(indegree,0,sizeof(indegree));
for(int i=0; i<m; ++i)
{
int a,b;
scanf("%d%d",&a,&b);
--a,--b;
v[b].push_back(a);//逆向建圖
++indegree[a];
}
Topsort();
}
return 0;
}
相關文章
- HDU 4857-逃生(反向拓撲排序-按條件排序)排序
- poj 1094 拓撲排序排序
- poj1094 拓撲排序排序
- POJ 3249-Test for Job(拓撲排序&&DP)排序
- 拓撲排序排序
- 拓撲排序詳解(梅開二度之dfs版按字典序輸出拓撲路徑+dfs版輸出全部拓撲路徑排序
- 拓撲排序,YYDS排序
- 拓撲排序模板排序
- POJ1094[有向環 拓撲排序]排序
- 拓撲排序小結排序
- 圖論——拓撲排序圖論排序
- 筆記:拓撲排序筆記排序
- 拓撲排序 POJ2367Genealogical tree[topo-sort]排序
- Reward (圖論+拓撲排序)圖論排序
- 拓撲排序 - Topological Sort排序
- 拓撲排序核心程式碼排序
- HDU 4857 逃生(拓撲排序)排序
- 【筆記/模板】拓撲排序筆記排序
- AOV網與拓撲排序排序
- DFS實現拓撲排序排序
- POJ1270 Following Orders[拓撲排序所有方案 Kahn]排序
- 拓撲排序就這麼回事排序
- HDU4857逃生(拓撲排序)排序
- 紙上談兵: 拓撲排序排序
- 有向圖的拓撲排序——DFS排序
- 演算法-圖論-拓撲排序演算法圖論排序
- POJ 1094-Sorting It All Out(元素大小關係-拓撲排序)排序
- 條件和排序排序
- 圖解拓撲排序+程式碼實現圖解排序
- 【圖論】拓撲排序+優先佇列圖論排序佇列
- HDU 5438 Ponds (拓撲排序應用+DFS)排序
- CF 274D Lovely Matrix(拓撲排序)排序
- 圖的拓撲排序詳解與實現排序
- 圖(3)--拓撲排序與關鍵路徑排序
- hdu 1811 並查集+拓撲排序並查集排序
- (set+拓撲排序) CF1572A Book排序
- 拓撲排序 (BFS )DAG (有向無環圖)排序
- VOL.2 拓撲排序與關鍵路徑排序