拓撲排序(字典序最小,字典序最小)


E. Minimal Labels

題意:

給出 m 條有向邊,組成有向無環圖,輸出一個 1 到 n 組成的排列,每個數只能出現一次,表示每個點的標號。如果有邊 (u,v)(u,v) 那么 labelu<labelvlabelu<labelv 。要求最后字典序盡可能小。

solution:

拓撲排序的變形。
這題要統計的是每個點的出度,比如說某個點出度為 0 ,那么它的標號一定很大(因為它不需要比別的點小了),又要求字典序最小,對於初始圖,那么出度為 0 的點且序號最大的點的標號一定為 n。優先隊列維護下(最大值優先),如果某個點的標號確定了,那么刪除所有連向這個點的邊,更新出度。、

搞清楚小的盡量靠前靠前的盡量小的區別

反向建圖:

 1 /*************************************************************************
 2     > File Name: a.cpp
 3     > Author: QWX
 4     > Mail: 
 5     > Created Time: 2018/11/11 9:43:08
 6  ************************************************************************/
 7 
 8 
 9 //{{{ #include
10 #include<iostream>
11 #include<cstdio>
12 #include<algorithm>
13 #include<vector>
14 #include<cmath>
15 #include<queue>
16 #include<map>
17 #include<set>
18 #include<string>
19 #include<cstring>
20 #include<complex>
21 #include<cassert>
22 //#include<bits/stdc++.h>
23 #define vi vector<int>
24 #define pii pair<int,int>
25 #define mp make_pair
26 #define pb push_back
27 #define fi first
28 #define se second
29 #define pw(x) (1ll << (x))
30 #define sz(x) ((int)(x).size())
31 #define all(x) (x).begin(),(x).end()
32 #define rep(i,l,r) for(int i=(l);i<(r);i++)
33 #define per(i,r,l) for(int i=(r);i>=(l);i--)
34 #define FOR(i,l,r) for(int i=(l);i<=(r);i++)
35 #define cl(a,b) memset(a,b,sizeof(a))
36 #define fastio ios::sync_with_stdio(false);cin.tie(0);
37 #define lson l , mid , ls
38 #define rson mid + 1 , r , rs
39 #define INF 0x3f3f3f3f
40 #define LINF 0x3f3f3f3f3f3f3f3f
41 #define ll long long
42 #define ull unsigned long long
43 #define dd(x) cout << #x << " = " << (x) << "," 
44 #define de(x) cout << #x << " = " << (x) << "\n" 
45 #define endl "\n"
46 using namespace std;
47 //}}}
48 
49 const int N=1e5+7;
50 int in[N],ans[N];
51 vi G[N]; 
52 int n,m;
53 
54 int main()
55 {
56     priority_queue<int,vector<int>,greater<int> > Q;
57     cin>>n>>m;
58     rep(i,0,m){
59         int u,v; cin>>u>>v;
60         in[v]++;
61         G[u].pb(v);
62     }
63     FOR(i,1,n)if(!in[i])Q.push(i);
64 //    FOR(i,1,3)dd(out[i]);cout<<endl;
65     int t=0;
66     while(!Q.empty()){
67         int u=Q.top();Q.pop();
68         ans[u]=++t;
69         for(auto v:G[u])if(--in[v]==0)Q.push(v);
70     }
71     FOR(i,1,n)cout<<ans[i]<<(i==n?'\n':' ');
72     return 0;
73 }
74 /*
75     4 2 
76     4 1
77     2 3
78 */
View Code

正向建圖(錯誤的做法):

這組數據過不了:

4 2
4 1
2 3

 1 /*************************************************************************
 2     > File Name: a.cpp
 3     > Author: QWX
 4     > Mail: 
 5     > Created Time: 2018/11/11 9:43:08
 6  ************************************************************************/
 7 
 8 
 9 //{{{ #include
10 #include<iostream>
11 #include<cstdio>
12 #include<algorithm>
13 #include<vector>
14 #include<cmath>
15 #include<queue>
16 #include<map>
17 #include<set>
18 #include<string>
19 #include<cstring>
20 #include<complex>
21 #include<cassert>
22 //#include<bits/stdc++.h>
23 #define vi vector<int>
24 #define pii pair<int,int>
25 #define mp make_pair
26 #define pb push_back
27 #define fi first
28 #define se second
29 #define pw(x) (1ll << (x))
30 #define sz(x) ((int)(x).size())
31 #define all(x) (x).begin(),(x).end()
32 #define rep(i,l,r) for(int i=(l);i<(r);i++)
33 #define per(i,r,l) for(int i=(r);i>=(l);i--)
34 #define FOR(i,l,r) for(int i=(l);i<=(r);i++)
35 #define cl(a,b) memset(a,b,sizeof(a))
36 #define fastio ios::sync_with_stdio(false);cin.tie(0);
37 #define lson l , mid , ls
38 #define rson mid + 1 , r , rs
39 #define INF 0x3f3f3f3f
40 #define LINF 0x3f3f3f3f3f3f3f3f
41 #define ll long long
42 #define ull unsigned long long
43 #define dd(x) cout << #x << " = " << (x) << "," 
44 #define de(x) cout << #x << " = " << (x) << "\n" 
45 #define endl "\n"
46 using namespace std;
47 //}}}
48 
49 const int N=1e5+7;
50 int out[N],ans[N];
51 vi G[N]; 
52 int n,m;
53 
54 int main()
55 {
56     priority_queue<int> Q;
57     cin>>n>>m;
58     rep(i,0,m){
59         int u,v; cin>>u>>v;
60         G[v].pb(u);
61         out[u]++;
62     }
63     FOR(i,1,n)if(!out[i])Q.push(i);
64 //    FOR(i,1,3)dd(out[i]);cout<<endl;
65     int nn=n;
66     while(!Q.empty()){
67         int u=Q.top();Q.pop();
68 //        de(u);
69         ans[u]=nn--;
70         for(auto v:G[u])if(--out[v]==0)Q.push(v);
71     }
72     FOR(i,1,n)cout<<ans[i]<<(i==n?'\n':' ');
73     return 0;
74 }
View Code

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM