1.课程表
课程表

class Solution {
public:
bool canFinish(int n, vector<vector<int>>& prerequisites) {
unordered_map<int,vector<int>> edges;
vector<int> in(n);
for(auto& e: prerequisites)
{
int a = e[0],b=e[1];
edges[b].push_back(a);
in[a]++;
}
queue<int> q;
for(int i=0;i<n;i++)
{
if(in[i]==0) q.push(i);
}
while(q.size())
{
auto t = q.front();q.pop();
for(auto a:edges[t])
{
in[a]--;
if(in[a] == 0) q.push(a);
}
}
for(int i=0;i<n;i++)
{
if(in[i]) return false;
}
return true;
}
};
2.课程表II
课程表II

class Solution {
public:
vector<int> findOrder(int numCourses, vector<vector<int>>& prerequisites) {
vector<vector<int>> edges(numCourses);
vector<int> in(numCourses);
for(auto& e:prerequisites)
{
int a = e[0],b=e[1];
edges[b].push_back(a);
in[a]++;
}
queue<int> q;
vector<int> ret;
for(int i=0;i<numCourses;i++)
{
if(in[i] == 0)
{
q.push(i);
ret.push_back(i);
}
}
while(q.size())
{
auto t = q.front();q.pop();
for(int a:edges[t])
{
in[a]--;
if(in[a] == 0)
{
q.push(a);
ret.push_back(a);
}
}
}
if(ret.size() == numCourses) return ret;
else return {};
}
};
3.火星词典
火星词典

class Solution {
unordered_map<char,unordered_set<char>> edges;
unordered_map<char,int> in;
bool cheak;
public:
string alienOrder(vector<string>& words) {
for(auto& s:words)
{
for(auto ch: s)
{
in[ch] = 0;
}
}
int n = words.size();
for(int i=0;i<n;i++)
{
for(int j=i+1;j<n;j++)
{
add(words[i],words[j]);
if(cheak) return "";
}
}
queue<char> q;
string ret;
for(auto&[a,b] : in)
{
if(b==0) q.push(a);
}
while(q.size())
{
char t = q.front();q.pop();
ret+=t;
for(auto a: edges[t])
{
if(--in[a]==0) q.push(a);
}
}
for(auto&[a,b] : in)
{
if(b!=0) return "";
}
return ret;
}
void add(string& s1, string& s2)
{
int n = min(s1.size(),s2.size());
int i=0;
for(;i<n;i++)
{
if(s1[i] != s2[i])
{
char a = s1[i],b = s2[i];
if(!edges.count(a) || !edges[a].count(b))
{
edges[a].insert(b);
in[b]++;
}
break;
}
}
if(i==s2.size() && i<s1.size()) cheak = true;
}
};