#include<bits/stdc++.h>
using namespace std;
const int maxn=100005;
vector<int>adj[maxn];
int degree[maxn];
int main(){
int n,m;
cin>>n>>m;
while(m--){
int a,b;
cin>>a>>b;
adj[a].push_back(b);
degree[b]++;
}
priority_queue<int,vector<int> ,greater<int> >q;
for(int i=1;i<=n;i++){
if(degree[i]==0){
q.push(i);
}
}
while(!q.empty()){
int u=q.top();
q.pop();
cout<<u<<" ";
for(int i=0;i<adj[u].size();i++){
int v=adj[u][i];
degree[v]--;
if(!degree[v])q.push(v);
}
}
return 0;
}
P1137
这题要求一直向东走,只能往东边走,并且有个入度为0的起点,因此这是一个有向无环图,可以进行拓扑排序,求出拓扑序列。
#include<bits/stdc++.h>
using namespace std;
const int maxn=100005;
vector<int>adj[maxn];
int degree[maxn];
int d[maxn];
int main(){
int n,m;
cin>>n>>m;
while(m--){
int a,b;
cin>>a>>b;
adj[a].push_back(b);
degree[b]++;
}
queue<int>q;
for(int i=1;i<=n;i++){
if(degree[i]==0){
q.push(i);
d[i]=1;
}
}
while(!q.empty()){
int u=q.front();
q.pop();
for(int i=0;i<adj[u].size();i++){
int v=adj[u][i];
degree[v]--;
if(!degree[v]){
q.push(v);
d[v]=d[u]+1;
}
}
}
for(int i=1;i<=n;i++){
cout<<d[i]<<endl;
}
return 0;
}
‘
T47354
按照拓扑排序的顺序DP
#include<bits/stdc++.h>
using namespace std;
const int maxn=5505;
typedef long long ll;
vector<int>adj[maxn];
int degree[maxn];
ll dp[maxn];
int main(){
int n,m,s,t;
cin>>n>>m>>s>>t;
while(m--){
int a,b;
cin>>a>>b;
adj[a].push_back(b);
degree[b]++;
}
queue<int>q;
for(int i=1;i<=n;i++){
if(degree[i]==0){
q.push(i);
}
}
dp[s]=1;
while(!q.empty()){
int u=q.front();
q.pop();
for(int i=0;i<adj[u].size();i++){
int v=adj[u][i];
degree[v]--;
dp[v]+=dp[u];
if(degree[v]==0){
q.push(v);
}
}
}
if(dp[t]==0)cout<<"No Path!";
else
cout<<dp[t];
return 0;
}