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 |
非排序算法,短数据全过…可是总有一些非常大的数据过不去,帮帮忙咯(带详细注释)做一个邻接矩阵,开始全部标记-1。标记通为 1,新增一条有向边 E<V1,V2> label_1: map[i][j]=map[j][i] 则输出矛盾 如果已经标记为1,则是一个已知的关系,跳过 然后如果未标记,标记 E<V1,V2> = 1; 并且,递归考察所有 V1 的入度以及 V2 的出度 每标记一个新的边,计数count++ 那么,确定所有关系的条件就是 count = N * ( N - 1 ) / 2 贴上代码: #include <iostream> using namespace std; //A 65 1 49 int n,m; //字母数量,判断数量 int map[30][30]; //邻接矩阵 char sort[30]; //输出时使用的字符数组 int sum[30]; //上文计数用的count int result,step; //结果标志,用了几步 bool sorted() //判断排序结束 { int add=0; for(int i=1; i<=n; i++) add+=sum[i]; if(add*2==n*n-n) return true; return false; } int com(const void* a,const void *b) //qsort用的比较函数,借助count排序, { //'ch'大于的字母多它的sum就大 if(sum[*(char*)a-64]>sum[*(char*)b-64]) return 1; if(sum[*(char*)a-64]<sum[*(char*)b-64]) return -1; cout<<"wrong in com"<<endl;return 0; // assert断言 这里不应该存在相等的情况 } void connect(int a,int b) //添加一条有向边(a,b)表示a>b 直接递归 { map[a][b]=1;++sum[a]; for(int i=1; i<=n; i++) if(map[b][i]==1&&i!=b&&map[a][i]!=1) connect(a,i); for(int j=1; j<=n; j++) if(map[j][a]==1&&j!=a&&map[j][b]!=1) connect(j,b); } int main() { //freopen("in.txt","r",stdin); //freopen("out.txt","w",stdout); while((cin>>n>>m)&&(n!=0)) { //初始化 result=step=0; for(int i=1; i<=n; i++) { for(int j=1; j<=n; j++) map[i][j]=-1; sort[i]=64+i; sum[i]=0;//sort初始化字母表顺序 } //读入数据 char a,b,c; //读数据用的变量 for(int i=1; i<=m; i++) { cin>>a>>b>>c; if(result){continue;} //结果已经有了 吃数据用的 if(map[a-64][c-64]==1) {result=2; step=i; continue;} //矛盾 返回不可能 connect(c-64,a-64); //添加边(递归) if( sorted() ) {result=1; step=i; continue;} //排序完成 } switch(result) { case 0: cout<<"Sorted sequence cannot be determined."<<endl; break; case 1: cout<<"Sorted sequence determined after "<<step<<" relations: "; qsort(sort+1,n,sizeof(sort[0]),com); //对输出排序 for(int i=1; i<=n; i++) cout<<sort[i]; //输出字符数组 cout<<"."<<endl; break; case 2: cout<<"Inconsistency found after "<<step<<" relations."<<endl; break; } }//end while return EXIT_SUCCESS; //这行没有任何问题 } Followed by:
Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator