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 |
跪求:我总是RUNTIME ERROR ,有没有哪个哥们帮我看看,是什么原因啊?我总是RUNTIME ERROR ,有没有哪个哥们帮我看看,是什么原因啊? #include <stdio.h> #include <stdlib.h> #include<iostream> #include <stack> #include<queue> // 利用 拓扑排序解题 using namespace std; #define MAX_NAME 3//顶点字符串的最大长度+1 typedef char VertexType[MAX_NAME];//图的顶点字符类型,最大长度2 typedef int InfoType;//顶点的权值类型 #define MAX_VERTEX_NUM 26 typedef enum {DG,DN,AG,AN}GraphKind;//{有向图,有向网,无向图,无向网} typedef struct ArcNode{ int adjvex;//该弧指向的顶点位置 struct ArcNode *nextarc;//指向下一条弧的指针 InfoType *info;//网的权值指针 }ArcNode; //表结点 typedef struct { char data;//顶点信息 ArcNode *firstarc;//第一表结点的地址,指向第一依附该结点的弧的指针 }Vnode,AdjList[MAX_VERTEX_NUM];//头结点 typedef struct { AdjList vertices; int vexnum,arcnum;//图的当前 的顶点数和弧数 int kind;//图的种类标志 }ALGraph ; void FindInDegree(ALGraph G,int *indegree){ int j=0; for(int i =0;i<G.vexnum;i++){ ArcNode *p; if(G.vertices[i].data>0) for(p=G.vertices[i].firstarc;p;p=p->nextarc) { indegree[p->adjvex]++; } } } int TopologicalSort(ALGraph &G,int k,stack<int> &s,queue<char> &q ){ //有向图G采用邻接表的存储结构 //若无回路,则输出G的一个拓扑排序 ,并返回 1 ,否则返回 0 int i; int * indegree=(int *)malloc(G.vexnum*sizeof(int));// 定义indegree数组 for(i =0;i<G.vexnum;i++) indegree[i]=0;//初始化 FindInDegree(G,indegree);// 对各顶点求入度indegree int num ; bool sure=true; for (num=0,i =0;i<G.vexnum;i++) if(!indegree[i]&&G.vertices[i].data>0){s.push(i);num++;}//入度为0的顶点进栈 //if(num>1){cout<<"Sorted sequence cannot be determined."<<endl;return 0;} //if(num==0){cout<<"Inconsistency found after 2 relations."<<endl;return 0;} int count=0;// 对输出 的顶点计数 while (!s.empty()) { if(s.size() > 1) //return 0;不能直接返回0表示不确定,还要继续看完看能不能发现环 sure = false; i=s.top(); s.pop(); q.push(G.vertices[i].data);count++;//i号顶点进队并计数 ArcNode *p; for(num=0,p=G.vertices[i].firstarc;p;p=p->nextarc) { int k2 =p->adjvex;// 对i 号顶点的每个邻接点的入度减1 if(!(--indegree[k2])){ s.push(k2);//若入度减为0 则让入栈 num++; } }//if(num>1){cout<<"Sorted sequence cannot be determined."<<endl;return 0;} // if(num==0){cout<<"Inconsistency found after 2 relations."<<endl;return 0;} } free(indegree); if(count<k){ while (!s.empty()) s.pop(); while (!q.empty()) q.pop(); return -1;}//先判断是否有环,k是实际有效的结点 数 else { if(sure && q.size()==G.vexnum)//无环时再看是否已经能排好序,能排好序有两种情况即多种拓扑排序中的一种或者仅确的 //一种这里必须是后者才行,否则返回不确定 { while (!s.empty()) s.pop(); return 1;} else {while (!s.empty()) s.pop(); while (!q.empty()) q.pop(); return 0;} /**cout<<"Sorted sequence determined after 4 relations: "; while (!q.empty()) {char a=q.front(); cout<<a;q.pop();} cout<<'.'<<'endl; return 1;*/ } } //CreateGraph int CreateGraph(ALGraph *G,int n,int m){ int i,j=0,t,k=0;//k 为计数变量 bool flag=true; int ok=0; ArcNode *p; ArcNode *temp; (*G).kind=0; (*G).vexnum=n; (*G).arcnum=m; stack<int> s; queue<char> q ; for (i=0;i<(*G).arcnum;i++) { //构建顶点向量 char a,b; cin>>a>>b>>b; //a=getchar(); //a=getchar(); if(a>'Z'||a<'A')cout<<"Your intput is not right.The program is going to exit."; for( j=0;j<k;j++) if(a==(*G).vertices[j].data)break; if(j>=k) {(*G).vertices[j].data=a; (*G).vertices[j].firstarc=NULL;k++;}//j弧尾 //getchar(); //a=getchar(); if(b>'Z'||b<'A')cout<<"Your intput is not right.The program is going to exit."; for( t=0;t<k;t++) if(b==(*G).vertices[t].data)break; if(t>=k) {(*G).vertices[t].data=b;(*G).vertices[t].firstarc=NULL;k++;}//t 弧头 p=(ArcNode*)malloc(sizeof(ArcNode)); for(temp=(*G).vertices[j].firstarc;temp;temp=temp->nextarc) if(t==temp->adjvex) { flag=false; break; } if(!flag) continue; p->adjvex=t; p->nextarc=(*G).vertices[j].firstarc;//插入在表头 (*G).vertices[j].firstarc=p; // getchar(); int sign=TopologicalSort((*G),k,s,q); if(sign==1&&!ok){ printf("Sorted sequence determined after %d relations: ",k); while (!q.empty()) {char a=q.front(); cout<<a;q.pop();} cout<<'.'<<endl; ok=1; } if(sign==-1&&!ok){ printf("Inconsistency found after %d relations.\n",k); ok=1; } } return ok; } int main(){ int n,m,ok; cin>>n>>m; while(n||m) { ALGraph g; // g.vertices=(Vnode*)malloc(n*sizeof(Vnode)); ok=CreateGraph(&g,n,m);// k为图实际有效的结点 if(!ok){cout<<"Sorted sequence cannot be determined."<<endl;} cin>>n>>m; } return 0; } Followed by:
Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator