| ||||||||||
| Online Judge | Problem Set | Authors | Online Contests | User | ||||||
|---|---|---|---|---|---|---|---|---|---|---|
| Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest | |||||||||
kahn写的,需要判断是否有环和是否唯一#include<cstdio>
#include<iostream>
#include<iomanip>
#include<cstring>
#include<cctype>
#include<cmath>
#include<cstdlib>
#include<ctime>
#include<cassert>
#include<vector>
#include<deque>
#include<list>
#include<set>
#include<map>
#include<string>
#include<sstream>
#include<stack>
#include<queue>
#include<algorithm>
using namespace std;
const int MAXN = 30 + 10;
const int INF_MAX = 1 << 28;
const double INF_MIN = 1e-8;
int n, m;
int edge[MAXN][MAXN];
bool input() {
cin >> n >> m;
if (n == 0 && m == 0) {
return false;
}
memset(edge, 0, sizeof(edge));
return true;
}
void kahn(int &idx, int *ans, bool &hasHuan, bool &isWeiYi) {
int *degree = new int[n];
memset(degree, 0, n * sizeof(n));
for (int j = 0; j < n; j++) {
for (int i = 0; i < n; i++) {
degree[j] += edge[i][j];
}
}
queue<int> q;
for (int i = 0; i < n; i++) {
if (degree[i] == 0) {
q.push(i);
}
}
isWeiYi = true;
idx = 0;
while (!q.empty()) {
int u = q.front();
q.pop();
ans[idx++] = u;
if ((int)q.size() != 0) {
isWeiYi = false;
}
for (int j = 0; j < n; j++) {
if (edge[u][j] == 1) {
degree[j]--;
if (degree[j] == 0) {
q.push(j);
}
}
}
}
hasHuan = idx < n;
}
void solve() {
int idx;
int *ans = new int[n];
bool isEnd = false;
for (int i = 1; i <= m; i++) {
char c1, tmp, c2;
cin >> c1 >> tmp >> c2;
edge[c1 - 'A'][c2 - 'A'] = 1;
if (isEnd) {
continue;
}
bool hasHuan;
bool isWeiYi;
kahn(idx, ans, hasHuan, isWeiYi);
if (hasHuan) {
cout << "Inconsistency found after ";
cout << i << " relations.\n";
isEnd = true;
continue;
}
if (!hasHuan && isWeiYi) {
cout << "Sorted sequence determined after ";
cout << i;
cout << " relations: ";
for (int i = 0; i < idx; i++) {
cout << (char)(ans[i] + 'A');
}
cout << ".\n";
isEnd = true;
continue;
}
}
if (!isEnd) {
cout << "Sorted sequence cannot be determined.\n";
}
}
int main()
{
//freopen("input.cpp", "r", stdin);///
//freopen("output.cpp", "w", stdout);///
while (input()) {
solve();
}
return 0;
}
Followed by:
Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator