| ||||||||||
| 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 | |||||||||
大牛们帮我看一下啊 orz..前面相关的讨论我都看了, 所有提到的数据我也都测试, 没有问题。 可是一提交还是WA, 大家帮忙看一下是什么问题啊
谢谢啦
P.S. 我是初学者
#include<cstdio>
#include<string>
using namespace std;
int n, inpl, dg[30], nv[30];
char str[10];
bool done, letter[30], adj[30][30];
bool TopologicalSort(){
int InDegree[n+1];
memset(InDegree, 0, sizeof(InDegree));
for(int j=1; j<=n; j++)
for(int i=1; i<=n; i++)
if(adj[i][j]){
InDegree[j]++;
dg[j]++;
}
int stack[n+1], v[n+1];
memset(stack, 0, sizeof(stack));
memset(v, 0, sizeof(v));
int top = 0, k = 0;
for(int i=1; i<=n; i++)
if(!InDegree[i]&&letter[i]) stack[++top] = i;
while(top){
int tmp;
tmp = stack[top--];
v[++k] = tmp;
for(int j=1; j<=n; j++)
if(adj[tmp][j]&&letter[j]&&InDegree[j]>0){
InDegree[j]--;
if(!InDegree[j]) stack[++top] = j;
}
}
int count = 0;
for(int i=1; i<=n; i++)
if(letter[i]) count++;
return (k==count);
}
bool bfs(int x){
memset(nv, 0, sizeof(nv));
int queue[700], head = 0, rear = 0;
bool m[n+1];
memset(queue, 0, sizeof(queue));
memset(m, 0, sizeof(m));
nv[x] = 1;
for(int j=1; j<=n; j++)
if(adj[x][j]){
nv[j] = nv[x]+1;
queue[++rear] = j;
m[j] = true;
}
while(head<rear){
int current = queue[++head];
m[head] = false;
for(int j=1; j<=n; j++)
if(adj[current][j]){
nv[j] = nv[current] + 1;
if(!m[j]){
queue[++rear] = j;
m[j] = true;
}
}
}
int prev = 0;
for(int i=1; i<=n; i++)
if(nv[i]==prev) return false;
else prev = nv[i];
// sort(nv+1, nv+n+1);
return true;
}
int main(){
// freopen("test.txt", "r", stdin);
while(1){
scanf("%d%d", &n, &inpl);
if(!n&&!inpl) break;
done = false;
memset(adj, 0, sizeof(adj));
memset(dg, 0, sizeof(dg));
memset(letter, 0, sizeof(letter));
for(int k=1; k<=inpl; k++){
scanf("%s", str);
if(!done){
adj[str[0]-'A'+1][str[2]-'A'+1] = 1;
letter[str[0]-'A'+1] = letter[str[2]-'A'+1] = true;
if(TopologicalSort()){
bool flag = true;
for(int i=1; i<=n; i++)
if(!letter[i]){
flag = false;
break;
}
if(flag){
int count = 0;
int tmp = 0;
for(int i=1; i<=n; i++)
if(!dg[i]){
tmp = i;
count++;
}
if(count>1){
if(k==inpl)
puts("Sorted sequence cannot be determined.");
}
else{
if(bfs(tmp)){
printf("Sorted sequence determined after %d relations: ", k);
for(int i=1; i<=n; i++)
for(int j=1; j<=n; j++)
if(nv[j]==i) printf("%c", j+'A'-1);
puts(".");
done = true;
}
else{
if(k==inpl)
puts("Sorted sequence cannot be determined.");
}
}
}
else
if(k==inpl)
puts("Sorted sequence cannot be determined.");
}
else{
printf("Inconsistency found after %d relations.\n", k);
done = true;
}
}//if
}//for
}//while
// while(1);
}
Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator