求教j題為什么只能過百分之30呀
跪求一組hack數(shù)據(jù)
大概的思路就是每次統(tǒng)計(jì)入度為0的點(diǎn)的數(shù)量為cnt,如果cnt==1則push進(jìn)ans,如果不為1則push cnt個-1進(jìn)ans
#define _CRT_SECURE_NO_WARNINGS #include<stdio.h> #include<stdlib.h> #include<algorithm> #include<string.h> #include<iostream> #include<queue> #include<math.h> #include<string> #include<map> #include<vector> using namespace std; int deg[1005]; int out[1005]; int visit[1005]; vector<int>res; vector<int>adj[1005]; queue<int>q; int N,M; int fa[1005]; int findx(int x) { while (fa[x] != x) { x = fa[x]; } return x; } int main(void) { cin >> N >> M; int i; for (i = 1; i <= N; i++) { fa[i] = i; } for (i = 1; i <= M; i++) { int t1, t2; scanf("%d %d", &t1, &t2); int flags = 1; for (auto y : adj[t1]) { if (y == t2) { flags = 0; break; } } if (flags) { adj[t1].push_back(t2); out[t1]++; deg[t2]++; fa[findx(t1)] = findx(t2); } } int flag = 1; for (i = 1; i <= N; i++) { if (deg[i]==0&&out[i]==0) { flag = 0; } } int father = findx(1); for (i = 2; i <= N; i++) { if (findx(i) != father) { flag = 0; } } if (!flag) { for (i = 0; i < N; i++) { res.push_back(-1); } } if (flag) { for (int i = 1; i <= N; i++) { if (deg[i] == 0) { q.push(i); } } int count = 0; while (!q.empty() && count < N) { int cnt = 0; for (i = 1; i <= N; i++) { if (visit[i]) { continue; } if (deg[i] == 0) { cnt++; visit[i] = 1; } } count += cnt; if (cnt == 1) { int x = q.front(); q.pop(); res.push_back(x); for (auto y : adj[x]) { if (--deg[y] == 0) { q.push(y); } } } else { for (i = 0; i < cnt; i++) { int th = q.front(); q.pop(); for (auto y : adj[th]) { deg[y]--; if (deg[y] == 0) { q.push(y); } } res.push_back(-1); } } } } for (i = 0; i <N-1; i++) { printf("%d ", res[i]); } printf("%d", res[N - 1]); system("pause"); return 0; }