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 |
好吧,终于过了,附代妈不暴力不会超时,TLE基本是因为死循环 //============================================================================ // Name : main1041.cpp // Author : // Version : // Copyright : Your copyright notice // Description : Hello World in C++, Ansi-style //============================================================================ #include <iostream> #include <vector> #include <queue> using namespace std; class junc; class street{ public: junc* j1; junc* j2; int num; }; bool operator<(street a, street b){ return a.num > b.num; } ostream& operator<<(ostream& out, street s){ out << s.j1 << " " << s.j2 << " " << s.num << endl; return out; } class junc{ public: //int num; //junc* next; //int streetNum; priority_queue<street> qs; }; class listNode{ public: listNode *next; junc *j; int streetNum; listNode(){ next = NULL; j = NULL; streetNum = 0; } }; ostream& operator<<(ostream& out, listNode& l){ listNode *L = &l; int cnt = 0; while(L != NULL && cnt < 10){ out << L << " "; L = L->next; cnt++; } out << endl; return out; } int Min(int a, int b){ if(a < b) return a; return b; } int Max(int a, int b){ if(a > b) return a; return b; } int main() {/* priority_queue<int,vector<int>,greater<int> > q; q.push(3); q.push(5); q.push(5); q.push(-9); q.push(16); for(int i = 0; i < 5; i++) { cout << q.top() << endl; q.pop(); }*/ while(1){ int cnt = 0; int start; int maxi = 0; //int streetNum = 0; //int data[6000] = {0}; junc junctions[2000]; while(1){ int j1, j2, str; cin >> j1 >> j2; if(j1==0 && j2==0){ break; } cnt++; if(cnt == 1) start = Min(j1, j2); cin >> str; if(maxi < Max(j1, j2)) maxi = Max(j1, j2); street s; s.j1 = &junctions[j1]; s.j2 = &junctions[j2]; s.num = str; junctions[j1].qs.push(s); junctions[j2].qs.push(s); } if(cnt == 0) return 0; bool can = true; for(int i = 1; i <= maxi; i++){ if(junctions[i].qs.size()%2){ can = false; break; } } if(!can){ cout << "Round trip does not exist." << endl; continue; } //cout << 1 << endl; bool state[2000] = {false}; int remain = cnt; //int curJ = start; listNode lS; lS.j = &junctions[start]; //cout << lS.next << endl; //cout << lS; //bool first = true; //lS.next = &lS; while(remain){ listNode *iter = &lS; while(iter != NULL){ junc *j = iter->j; if(!j->qs.empty()){ while(!j->qs.empty() && state[j->qs.top().num]){ j->qs.pop(); } } if(!j->qs.empty()){ break; } iter = iter->next; } //junc *dy = iter->j; //listNode *temp = iter->next; listNode ret; ret.j = iter->j; ret.next = iter->next; ret.streetNum = iter->streetNum; //cout << iter << endl; street temp = iter->j->qs.top(); iter->j->qs.pop(); state[temp.num] = true; //cout << temp.num << endl; remain --; iter->streetNum = temp.num; street curS = temp; while(1){ listNode *Temp = new listNode(); //cout << 1 << endl; if(iter->j == curS.j1) Temp->j = curS.j2; else Temp->j = curS.j1; iter->next = Temp; //cout << iter << endl; iter = iter->next; junc *j = Temp->j; if(!j->qs.empty()){ while(!j->qs.empty() && state[j->qs.top().num]){ j->qs.pop(); } } if(j->qs.empty()){ break; } curS = j->qs.top(); j->qs.pop(); state[curS.num] = true; //cout << curS.num << endl; iter->streetNum = curS.num; remain--; //cout << lS; } iter->j = ret.j; iter->next = ret.next; iter->streetNum = ret.streetNum; } listNode *it = &lS; //cout << *it ; while(it != NULL && it->next != NULL){ cout << it->streetNum << " "; it = it->next; } cout << endl; } //cout << "!!!Hello World!!!" << endl; // prints !!!Hello World!!! return 0; } Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator