POJ 1094
2014-04-08 20:34
519 查看
一道赤裸裸的toposort,开始没想那么多,先输入再构图最后toposort,写到一半发现行数没办法发输出了。。。。仔细一想貌似还是要输入一次拓扑一次。。。
#include<stdio.h> #include<string.h> #include<stack> int judge[50][50]; char ans[27]; int sum[27]; int charge[27]; int temp[27]; int list[27],n,m; int toposort(int p){ int cnt,yes=0,j,r; r=0; for(int i=0;i<n;i++){ temp[i]=sum[i]; } while(p--){ cnt=0; for(int i=0;i<n;i++){ if(temp[i]==0) j=i,cnt++; } //printf("C=%d\n",cnt); if(cnt>=1){ if(cnt>1) yes=1; for(int i=0;i<n;i++){ if(judge[j][i]==1) temp[i]--; } ans[r++]=j+'A'; temp[j]=-1; ans[r]=0; } else if(cnt==0) return -1; } if(yes==0) return r; else return 0; } int main(){ int yes,num,k,de,t; char a,b; while(scanf("%d%d",&n,&m)!=EOF&&n!=0&&m!=0){ getchar(); memset(judge,0,sizeof(judge)); memset(sum,0,sizeof(sum)); memset(charge,0,sizeof(charge)); yes=0; num=0; de=0; for(int i=1;i<=m;i++){ scanf("%c<%c",&a,&b); getchar(); if(charge[a-'A']==0){ num++; charge[a-'A']=1; } if(charge[b-'A']==0){ num++; charge[b-'A']=1; } judge[a-'A'][b-'A']=1; sum[b-'A']++; if(judge[b-'A'][a-'A']==1){ yes=1; k=i; } if(de==0&&yes==0){ t=toposort(num); //printf("T%d\n",t); if(t==-1){ de=-1; k=i; } else if(t==n){ de=1; k=i; } } } if(de==-1||yes==1){ printf("Inconsistency found after %d relations.\n",k); } else if(de==0){ printf("Sorted sequence cannot be determined.\n"); } else{ printf("Sorted sequence determined after %d relations: %s.\n",k,ans); } } return 0; }
相关文章推荐
- 用单调栈解决最大连续矩形面积问题
- 2632 Crashing Robots的解决方法
- 1573 Robot Motion (简单题)
- poj 2485 Highways
- poj 1511 Invitation Cards
- poj1042
- poj1080
- poj1088
- poj1063 Flip and Shift
- poj 3249 Test for Job 最长路
- HDU 3342
- 状态压缩DP poj 2817 WordStack 入门题
- POJ 2406 Power Strings
- POJ 2352 Stars
- POJ 3264 Balanced Lineup
- POJ 1056 IMMEDIATE DECODABILITY
- POJ 1979
- 线段树的运用 以及poj上的经典题目
- POJ 2801 填词游戏
- POJ1003解题方案