unsigned long long int DFS(Vertex* input, Vertex* sourceMinistry) { //Depth-First Search bāzēts algoritms input->TaggedBy.Reset(); if (input->TaggedBy.FindInVP(sourceMinistry->ID)) { //Meklē, vai dotā izd. pozīcija ir jau reiz "apmeklēta", skatoties no dotās ministrijas (meklē ciklus) Error* E3 = new Error(sourceMinistry->ID); E3List.AddSort(E3); return 0; } input->TaggedBy.Reset(); input->Visited = true; VertexPointer* TB = new VertexPointer(sourceMinistry); input->TaggedBy.AddSort(TB); //Pievieno virsotnei, ka tā ir tikusi apmeklēta, skatoties no dotās ministrijas. input->Subs.Reset(); if (input->Subs.Size() == 0) { //Ja nav apakšpozīciju, jāatgriež šīs pozīcijas Amount return input->Amount; } unsigned long long int sum = 0; while (VertexPointer* C = input->Subs.Current()) { sum += DFS(C->PointsTo, sourceMinistry); //Atrod apakšpozīciju kopsummu input->Subs.Next(); } unsigned long long int tmpDiff = sum > input->Amount ? sum - input->Amount : input->Amount - sum; if (tmpDiff > 4000000000) tmpDiff = 4000000001; input->Difference = (unsigned int)tmpDiff; input->Subs.Reset(); return sum; }
void DoAll() { VertexList.Reset(); for (int i = 0; i < ministryCount; i++) { DFS(VertexList.Current(), VertexList.Current()); VertexList.Next(); } VertexList.Reset(); while (Vertex* C = VertexList.Current()) { if (!C->Visited) { //Ja virsotne nav tikusi apmeklēta, tai nav ministrijas Error* E2 = new Error(C->ID); E2List.AddSort(E2); } if (C->Difference > 0) { Error_4* E4 = new Error_4(C->ID, C->Difference); E4List.AddSort(E4); } if (C->TaggedBy.Size() > 1) { //Ja virsotni apmeklējusi vairāk kā viena ministrija, ir kopīga pozīcija VertexPointer* vp = new VertexPointer(C); CPList.AddSort(vp); } VertexList.Next(); } VertexList.Reset(); }
void AddVertex(int parent, int child, unsigned int amount) { VertexList.Reset(); Vertex* NewSub = new Vertex(child, amount); Vertex* ParentV = NULL; Vertex* ChildV = NULL; VertexPointer* ParentToSub; bool SubIsNew = true; while(Vertex* C = VertexList.Current()) { if(C->ID == child) { SubIsNew = false; ChildV = C; if(ParentV) break; } //Atrod pozīciju un apakšpozīciju, ja tādas eksistē if(C->ID == parent) { ParentV = C; if(!SubIsNew) break; } VertexList.Next(); } VertexList.Reset(); if(ParentV) { if(SubIsNew) ParentToSub = new VertexPointer(NewSub); //Norāde uz apakšpozīciju else { ParentToSub = new VertexPointer(ChildV); if(ChildV->Amount == 4000000100) ChildV->Amount = amount; //Apakšpozīcija iepriekš bija bez virspozīcijas } if (ParentV->Subs.FindInVP(child)) return; //Ja apakšpozīcija jau ir pievienota, to ignorē ParentV->Subs.Add(ParentToSub); //Pievieno apakšpozīciju dotajai virspozīcijai if(SubIsNew) VertexList.Add(NewSub); //Pievieno apakšpozīciju virsotņu sarakstam (ja tā ir jauna) } else { ParentV = new Vertex(parent, 4000000100); //Norāda, ka pozīcijai nav virspozīcijas (neattiecas uz ministrijām) if(SubIsNew) ParentToSub = new VertexPointer(NewSub); else { ParentToSub = new VertexPointer(ChildV); ChildV->Amount = amount; //Tā kā, ja pievieno jau eksistējošu apakšpozīciju, Amount nemainās, to var piešķirt. } ParentV->Subs.Add(ParentToSub); VertexList.Add(ParentV); if(SubIsNew) VertexList.Add(NewSub); } if (child <= ministryCount) { Error* e1 = new Error(child); //Mēģina pievienot ministriju kā apakšpozīciju E1List.AddSort(e1); } }
void User::Add(List &list) //添加物流信息,其中调用异常处理 { Node *head,*p; string name,jijian_phone,Note,shoujian_phone; string num_t,money_t,baojia_t; //"_t"表示临时变量 int num,money,baojia; int tag1=0,tag2=0,tag3=0,i; head=list.Gethead(); //调用Gethead函数(AddrList中),取首指针 p=new Node; cout<<"包裹单号 收件人名称 收件人电话 寄件人电话 备注 邮费 保价金额,空格隔开"<<endl; cin>>num_t>>name>>shoujian_phone>>jijian_phone>>Note>>money_t>>baojia_t; cin.ignore(1024,'\n'); //将键盘输入的数据暂时保存到临时变量中 /***********以下的代码用来判断输入的数据是否合理,不合理将抛出异常************/ for(i=0;i<num_t.length();i++){ if(num_t[i]<='9'&&num_t[i]>='0') { } else { tag1=1; } } for(i=0;i<money_t.length();i++) { if(money_t[i]<='9'&&money_t[i]>='0') //判断输入是否合法 { } else { tag2=1; } } for(i=0;i<baojia_t.length();i++){ if(baojia_t[i]<='9'&&baojia_t[i]>='0') //判断输入是否合法 { } else { tag3=1; } } if(tag1==1||tag2==1||tag3==1) throw "运单号,运费,保价金额必须都为数字!请重新输入:"; //如果输入不合理将抛出异常 /***********以上的代码用来判断输入的数据是否合理,不合理将抛出异常************/ num=atoi(num_t.c_str()); //如果输入的输入验证为合理,就从string转换为int money=atoi(money_t.c_str()); baojia=atoi(baojia_t.c_str()); p->SetPackageNum(num); //调用SetPackageNum函数(Node中),修改运单号码 p->SetShoujian_Name(name); //调用SetShoujian_Name函数(Node中),修改收件人姓名 p->SetShoujian_Phone(shoujian_phone); //调用SetShoujian_Phone函数(Node中),修改寄件人电话 p->SetJijian_Phone(jijian_phone); //调用SetJijian_Phone函数(Node中),修改收件人号码 p->SetNote(Note); //调用SetNote函数(Node中),修改备注 p->SetMoney(money); //调用SetMoney函数(Node中),修改价格 p->SetBaojia(baojia); //调用SetBaojia函数(Node中),修改保价金额 list.AddSort(p); //调用AddSort函数(AddrList中),将p指向的结点按包裹号的顺序插入到链表中 }