输入的第一行为以空格分隔的两个正整数,第一个表示原始美味总数n,第二个表示前置菜肴范式总数m。 其后m行每行均为一个以空格分隔的范式说明,第一列为待吃菜肴的标号,第二列为前置菜肴的标号。
对每组测试数据,单独输出一行答案,菜肴标号之间用英文逗号分隔。
4 4 1 0 2 0 3 1 3 2
只需输出以下任一种结果即可 0,1,2,3 或 0,2,1,3
#include <bits/stdc++.h> using namespace std; int main() { int n, m; scanf("%d %d", &n, &m); vector<vector<int>> tmap(n + 5); int *count = new int[n + 5]; memset(count, 0, sizeof(int)*(n+5)); for (int i=0; i<m; i++) { int from, to; scanf("%d %d", &to, &from); tmap[from].push_back(to); count[to]++; } queue<int> zeros; for (int i=0; i<n; i++) { if (count[i] == 0) { zeros.push(i); } } vector<int> ans; while (!zeros.empty()) { int now = zeros.front(); zeros.pop(); vector<int> &tto = tmap[now]; for (vector<int>::iterator it = tto.begin(); it!=tto.end(); it++) { count[*it]--; if (count[*it] == 0) zeros.push(*it); } ans.push_back(now); } string out; if (ans.size() != n) { cout << "None" << endl; } else { for (vector<int>::iterator it = ans.begin(); it != ans.end(); it++) { out += to_string((*it)); out += ","; } } cout << out.substr(0, out.length()-1); return 0; }
#include <bits/stdc++.h> using namespace std; int main(){ int n, m, u, v; scanf("%d%d", &n, &m); vector<int> G[n], r; int in[n]; memset(in, 0, sizeof(in)); for(int i=0;i<m;i++){ scanf("%d%d", &u, &v); G[v].push_back(u); in[u]++; } queue<int> q; for(int i=0;i<n;i++) if(in[i]==0) q.push(i); while(!q.empty()){ u = q.front(); q.pop(); r.push_back(u); for(auto &v: G[u]) if(--in[v]==0) q.push(v); } if(r.size() < n) printf("None\n"); else for(int i=0;i<n;i++){ if(i==n-1) printf("%d\n", r[i]); else printf("%d,", r[i]); } return 0; }
import java.io.*; public class Main{ public static void main(String[] args) throws IOException{ BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); String[] strs = br.readLine().split(" "); int n = Integer.parseInt(strs[0]), m = Integer.parseInt(strs[1]); boolean[][] graph = new boolean[n][n]; // graph[i][j]代表i是否需要j while(m-->0){ strs = br.readLine().split(" "); graph[Integer.parseInt(strs[0])][Integer.parseInt(strs[1])] = true; } int[] res = new int[n]; // 存放输出序列 boolean[] isRecord = new boolean[n]; // 存放i是否已经在输出序列中 int index = 0, len = 0; // index为当前索引,len为操作一次后res的实际长度 do{ // 更新index index = len; // 找到没有前置要求的新节点 for(int i = 0; i < n; i++){ if(isRecord[i]) continue; int tmp = 0; while(tmp<n){ if(graph[i][tmp]) break; tmp++; } if(tmp == n) {res[len++] = i; isRecord[i] = true;} } // 用节点来更新图 for(int i = index; i < len; i++) for(int row = 0; row < n; row++) graph[row][res[i]] = false; }while(index < len); if(len == n){ StringBuilder sb = new StringBuilder(); for(int i : res) sb.append(","+i); System.out.println(sb.substring(1)); }else System.out.println("None"); } }
import java.lang.String; import java.io.BufferedReader; import java.io.InputStreamReader; import java.io.IOException; import java.util.HashMap; import java.util.LinkedList; import java.util.Queue; import java.util.Iterator; public class Main { public static void main(String[] args) throws IOException { BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); String[] params = br.readLine().split(" "); int n = Integer.parseInt(params[0]); // 顶点数 int m = Integer.parseInt(params[1]); // 边数 HashMap<Integer, LinkedList<Integer>> graph = new HashMap<>(); HashMap<Integer, Integer> inDegree = new HashMap<>(); Queue<Integer> queue = new LinkedList<>(); for(int i = 0; i < m; i++){ String[] pair = br.readLine().split(" "); int from = Integer.parseInt(pair[1]); int to = Integer.parseInt(pair[0]); if(graph.containsKey(from)){ graph.get(from).add(to); }else{ LinkedList<Integer> neighbors = new LinkedList<>(); neighbors.add(to); graph.put(from, neighbors); } inDegree.put(to, inDegree.getOrDefault(to, 0) + 1); } // 入度为0的作为起点 for(int node = 0; node < n; node++){ if(!inDegree.containsKey(node)){ queue.offer(node); } } StringBuilder res = new StringBuilder(); // 拓扑排序 int count = 0; while(!queue.isEmpty()){ int cur = queue.poll(); res.append(cur).append(","); count ++; if(graph.containsKey(cur)){ Iterator<Integer> iterator = graph.get(cur).iterator(); while(iterator.hasNext()){ int next = iterator.next(); if(inDegree.get(next) == 1){ inDegree.remove(next); queue.offer(next); }else{ inDegree.put(next, inDegree.get(next) - 1); } } } } if(count == n){ // 可以品尝完所有菜肴 res.deleteCharAt(res.length() - 1); System.out.println(res); }else{ System.out.println("None"); } } }
import java.util.*; public class Main { // 拓扑排序函数 public static String findOrder(int m, int n, int[][] prerequisites) { // 邻接表表示有向图 List<List<Integer>> graph = new ArrayList<>(); for (int i = 0; i < m; i++) { graph.add(new ArrayList<>()); } // 入度数组 int[] inDegree = new int[m]; // 构建图 for (int[] prerequisite : prerequisites) { int cur = prerequisite[0]; int pre = prerequisite[1]; graph.get(pre).add(cur); inDegree[cur]++; } // 使用队列进行广度优先搜索 Queue<Integer> queue = new LinkedList<>(); for (int i = 0; i < m; i++) { if (inDegree[i] == 0) { queue.add(i); } } // 存储拓扑排序结果 List<Integer> order = new ArrayList<>(); while (!queue.isEmpty()) { int node = queue.poll(); order.add(node); for (int neighbor : graph.get(node)) { inDegree[neighbor]--; if (inDegree[neighbor] == 0) { queue.add(neighbor); } } } // 检查是否存在循环依赖 if (order.size() != m) { return "None"; } // 输出结果 StringBuilder result = new StringBuilder(); for (int i = 0; i < order.size(); i++) { result.append(order.get(i)); if (i != order.size() - 1) { result.append(","); } } return result.toString(); } public static void main(String[] args) { Scanner scanner = new Scanner(System.in); // 读取菜品总数和前置关系总数 int m = scanner.nextInt(); int n = scanner.nextInt(); int[][] prerequisites = new int[n][2]; for (int i = 0; i < n; i++) { prerequisites[i][0] = scanner.nextInt(); prerequisites[i][1] = scanner.nextInt(); } // 计算并输出结果 System.out.println(findOrder(m, n, prerequisites)); scanner.close(); } }
import sys line=sys.stdin.readline().strip() values=list(map(int,line.split())) n=values[0] m=values[1] result=[] nlist=[ i for i in range(n)] mlist=[i for i in range(m)] dic={} for i in range(m): line = sys.stdin.readline().strip() values = list(map(int, line.split())) if values[0] in dic: dic[values[0]].append(values[1]) else: listtmp=[values[1]] dic[values[0]]=listtmp ktmp=dic.keys() k=[] for i in ktmp: k.append(i) for i in nlist: if i not in k: result.append(i) while len(result)<n: lentmp=len(result) for item in k: if set(dic[item]).issubset(set(result)): result.append(item) del dic[item] k.remove(item) if lentmp==len(result): result=[None] break for i in range(len(result)): if i==len(result)-1: print(result[i]) else: print(result[i], end=",")
import java.util.*; public class Main{ public static void main(String[] args){ Scanner sc = new Scanner(System.in); String[] str = sc.nextLine().split(" "); int n = Integer.parseInt(str[0]); int m = Integer.parseInt(str[1]); int[][] graph = new int[n][n]; for(int i = 0;i<m;i++){ String[] s = sc.nextLine().split(" "); graph[Integer.parseInt(s[0])][Integer.parseInt(s[1])]=1; } int[] res = new int[n]; int[] visit = new int[n]; int index = 0; int len = 0; do{ index = len; for(int i = 0;i<n; i++){ if(visit[i] == 1)contine; int j=0; while(j<n){ if(graph[i][j] == 1) break; j++; } if(j==n){ res[len++] = i; visit[i] = 1; } } for(int i = index; i<len;i++){ for(int rows = 0;rows<n;rows++){ graph[rows][resi] = 0; } } } while(index<len); if(len == n){ StringBuilder sb = new StringBuilder(); for(int i:res) sb.append(","+i); System.out.printIn(sb.substring(1)); }else{ System.out.printIn("None"); } } }
import collections, sys n, m = [int(num) for num in sys.stdin.readline().split()] indegrees = [0] * n dic = collections.defaultdict(list) for i in range(m): d, pred = [int(num) for num in sys.stdin.readline().split()] if d != pred: dic[pred].append(d) indegrees[d] += 1 queue = [] for i in range(n): if indegrees[i] == 0: queue.append(i) res = [] while len(queue): d = queue.pop(0) res.append(d) for postd in dic[d]: indegrees[postd] -= 1 if indegrees[postd] == 0: queue.append(postd) if len(res) == n: print(','.join([str(num) for num in res])) else: print(None)
#include <cstdio> #include <cstring> #include <iostream> #include <algorithm> #include <vector> #include <queue> #include <set> #include <map> #include <string> #include <cmath> #include <cstdlib> #include <ctime> using namespace std; typedef long long LL; int check[50000]; int a[50000],b[50000]; vector<int> tu[50000]; int n,m,number; int main(int argc, char const *argv[]) { int x,y; cin >> n >> m; if(m == 0) { for(int i = 0;i < n;i++) { if(i == n-1) cout << i << endl; else { cout << i << ","; } } } for(int i = 1;i <= m;i++) { cin >> x >> y; tu[y].push_back(x); a[x]++; } queue<int> qua; for(int i = 0;i < n;i++) { if(a[i] == 0) qua.push(i); } while(!qua.empty()) { int u = qua.front(); qua.pop(); b[++number] = u; for(int i = 0;i < tu[u].size();i++) { int k = tu[u][i]; a[k]--;//通过u这个入度为0的点解锁下面的点 if(a[k] == 0)//如果这个点通过解锁入度为0则放到队列中 { qua.push(k); } } } if(number != n) { cout << "None" << endl; return 0; } for(int i = 1;i <= number;i++) { if(i == n) cout << b[i] << endl; else { cout << b[i] << ","; } } return 0; }
/*leetcode Course Schedule II原题基本上 类似图进行dfs遍历,我们要做的就是找是否存在环,如果有环,直接false,否则我们返回其中一个遍历序列 分成以下几步: 1.GraphNode以及初始图关系的构建 2.遍历初始节点,进行dfs,那么如何判断有环呢?如果我们在当前节点处dfs后,相邻的节点中有已访问的或者又 递归到了已访问的节点之中,那么此时就是有环的 3.根据第二步,因此我们可以用一个visit数组来标记状态,以及一个onpath数组来判定是否已经在路径上了 */ #include <iostream> #include <vector> #include <set> #include <utility> #include <algorithm> using namespace std; class Solution { public: vector<int> findOrder(int numCourses, vector<pair<int, int>>& prerequisites) { vector<set<int>> graph=make_graph(numCourses,prerequisites);//构造图 vector<int> res; vector<bool> onpath(numCourses,false),visited(numCourses,false); //分别为是否在路径上以及节点的访问状态 for(int i=0;i<numCourses;++i) if(!visited[i] && dfs(graph,i,onpath,visited,res))//如果当前节点还未访问,但是dfs结果是返回true,相矛盾了 return {}; return res; } private: vector<set<int>> make_graph(int numCourses,vector<pair<int,int>>& prerequisites){ vector<set<int>> graph(numCourses); for(auto pre:prerequisites) graph[pre.second].insert(pre.first); return graph; } bool dfs(vector<set<int>>& graph,int node,vector<bool>& onpath,vector<bool>& visited,vector<int>& res){ if(visited[node]) return false; //已经访问过了 onpath[node]=visited[node]=true; //当前节点状态修改为已访问及在路径上 for(int neigh:graph[node]) if(onpath[neigh] || dfs(graph,neigh,onpath,visited,res)) return true; res.push_back(node); return onpath[node]=false; //重新将onpath[node]置为false } }; int main(){ int n,m; cin>>n; cin>>m; vector<pair<int,int>> vec; //输入关系 int num=n; while(n--){ int first,second; cin>>first; cin>>second; vec.push_back({second,first}); } Solution sol; vector<int> res; res=sol.findOrder(num,vec); if(res.empty()) cout<<"None"; else{ for(int i=0;i<res.size()-1;++i) cout<<res[i]<<","; cout<<res[res.size()-1]; } return 0; }反正大致是这样的思路