找入度为0的点,使与其连接的点都入度-1。
#include<iostream>
#include<cstdio>
#include<string>
#include<cmath>
#include<cstring>
#include<algorithm>
#include<map>
#include<queue>
#include<vector>
using namespace std;
#define ll long long
#define PII piar
map<char,int>mp;
vector<int>v[10];
queue<int>q;
int ideg[50],ans[50],k=1;
bool topsort(){
int num=0;
for(int i=1;i<=5;i++)
if(!ideg[i]) q.push(i);
while(!q.empty()){
int j=q.front();//点
ans[k++]=j;
num++;
q.pop();
for(int i=0;i<v[j].size();i++){
if(--ideg[v[j][i]]==0) q.push(v[j][i]);
}
}
if(num==5) return true;
return false;
}
signed main()
{
mp['A']=1;
mp['B']=2;
mp['C']=3;
mp['D']=4;
mp['E']=5;
for(int i=1;i<=5;i++){
string s; cin>>s;
getchar();
int x=mp[s[0]],y=mp[s[2]];
if(s[1]=='>') swap(x,y);
ideg[y]++;
v[x].push_back(y);
}
if(!topsort()) cout<<"impossible"<<endl;
else{
// while(!q.empty()){
// char c=q.front();
// cout<<c;
// q.pop();
// }
// cout<<k;
for(int i=1;i<k;i++){
char c=ans[i]-(1-'A');
cout<<c;
}
cout<<endl;
}
}
别老是忘记
string s; cin>>s;
getchar();
拓扑排序
三个要素:ideg:点的入度
v[maxn]:点的连接点
q:拓扑序列
const int maxn=1e5;
int ideg[maxn];//入度
vector<int>v[maxn];//点的连接点
void topsort(){
queue<int>q;//拓扑序列
for(int i=1;i<=n;i++) if(!ideg[i]) q.push(i);
while(!q.empty()){
int j=q.front();//入度为0的点
q.pop();
for(int i=0;i<v[j].size();i++){//v[j][i]为j所连接的点
if(--ideg[v[j][i]]==0) q.push(v[j][i]);
}
}
}
signed main(){
int T; cin>>T;
while(T--){
int n,m; cin>>n>>m;
for(int i=1;i<=n;i++) v[i].clear();
memset(ideg,0,sizeof ideg);
for(int i=1;i<=m;i++){
int x,y; cin>>x>>y;
ideg[y]++;
v[x].push_back(y);
}
topsort();
}
}