1940. Ordering Tasks
2016-12-04 10:29
309 查看
一道典型的拓扑排序题,在有多解的情况下输出字典序最小的。我在这里被坑了好久,在每次插入队列或向量后都要对其进行重新的排序才能保证输出的是最小字典序。可以用set来选作储存容器。
接下来是两个错误的代码
错误一:插入队列后并没有排序,假设在队列中的节点有1,5;然后对1进行操作的时候,有加入了节点2,那么队列中的数据就成了5,2。显然是不合理的。
代码二:
错误原因:还是顺序的问题比如在第一循环处理的时候有节点2,4将要输出,在处理2的时候得到3节点入度为0,但是输出的时候还是输出2,4,3。改正的时候我加了flag当每次得到新的节点就,跳出循环又从节点1开始,但是超时,毕竟循环是O(NumVex)而且有许多不必要的比较操作。
#include <iostream> #include <cstring> #include <vector> #include <algorithm> #include <cmath> #include <queue> #include <set> using namespace std; const int maxn =100010; int NumVex,NumEdge; int vis[maxn]; int indegree[maxn]; struct edge { int end; edge(int _end=0):end(_end){} }; bool cmp(edge a,edge b) { return a.end<b.end; } vector<edge> v[maxn]; void f() { set<int> Q; for (int i=1;i<=NumVex;i++) { if(indegree[i]==0) { Q.insert(i); } } while (!Q.empty()) { int tmp = *Q.begin(); cout<<tmp<<" "; Q.erase(Q.begin()); for (int i=0;i<v[tmp].size();i++) { if((--indegree[v[tmp][i].end])==0) { Q.insert(v[tmp][i].end); } } } cout<<endl; } int main() { int t; cin>>t; while(t--) { cin>>NumVex>>NumEdge; memset(indegree,0,sizeof(indegree)); for(int i=1;i<=NumVex;i++) v[i].clear(); for(int i=1;i<=NumEdge;i++) { int a,b; cin>>a>>b; v[a].push_back(edge(b)); indegree[b]++; } f(); } }
接下来是两个错误的代码
错误一:插入队列后并没有排序,假设在队列中的节点有1,5;然后对1进行操作的时候,有加入了节点2,那么队列中的数据就成了5,2。显然是不合理的。
#include <iostream> #include <cstring> #include <vector> #include <algorithm> #include <cmath> #include <queue> using namespace std; const int maxn =100010; int NumVex,NumEdge; int vis[maxn]; int indegree[maxn]; struct edge { int end; edge(int _end=0):end(_end){} }; bool cmp(edge a,edge b) { return a.end<b.end; } vector<edge> v[maxn]; void f() { queue<int> Q; for (int i=1;i<=NumVex;i++) { if(indegree[i]==0) { Q.push(i); } } while (!Q.empty()) { int tmp = Q.front(); cout<<tmp<<" "; Q.pop(); for (int i=0;i<v[tmp].size();i++) { if((--indegree[v[tmp][i].end])==0) { Q.push(v[tmp][i].end); } } } } int main() { int t; cin>>t; while(t--) { cin>>NumVex>>NumEdge; memset(indegree,0,sizeof(indegree)); for(int i=1;i<=NumVex;i++) v[i].clear(); for(int i=1;i<=NumEdge;i++) { int a,b; cin>>a>>b; v[a].push_back(edge(b)); indegree[b]++; } for (int i=1;i<=NumVex;i++) sort(v[i].begin(),v[i].end(),cmp);//这里换另一种方式不能通过sicily的编译 memset(vis,0,sizeof(vis)); f(); cout<<endl; } }
代码二:
错误原因:还是顺序的问题比如在第一循环处理的时候有节点2,4将要输出,在处理2的时候得到3节点入度为0,但是输出的时候还是输出2,4,3。改正的时候我加了flag当每次得到新的节点就,跳出循环又从节点1开始,但是超时,毕竟循环是O(NumVex)而且有许多不必要的比较操作。
#include <iostream> #include <cstring> #include <vector> #include <algorithm> #include <cmath> using namespace std; const int maxn =100010; int NumVex,NumEdge; int vis[maxn]; int indegree[maxn]; struct edge { int end; edge(int _end=0):end(_end){} }; bool cmp(edge a,edge b) { return a.end<b.end; } vector<edge> v[maxn]; void f() { int ans[NumVex]; int k = 0; for (int p =0;p<NumVex;p++) { if(k==NumVex) break; for(int i=1;i<=NumVex;i++) { if(indegree[i]==0&&!vis[i]) { vis[i] = 1; ans[k++]=i; for (int j=0;j<v[i].size();j++) { if(!vis[v[i][j].end]) { indegree[v[i][j].end]--; } } } } } for (int i=0;i<NumVex;i++) cout<<ans[i]<<" "; cout<<endl; } int main() { int t; cin>>t; while(t--) { cin>>NumVex>>NumEdge; memset(indegree,0,sizeof(indegree)); for(int i=1;i<=NumVex;i++) v[i].clear(); for(int i=1;i<=NumEdge;i++) { int a,b; cin>>a>>b; v[a].push_back(edge(b)); indegree[b]++; } for (int i=1;i<=NumVex;i++) sort(v[i].begin(),v[i].end(),cmp); memset(vis,0,sizeof(vis)); f(); } }
相关文章推荐
- 1940. Ordering Tasks
- 1005. Ordering Tasks
- Ordering Tasks UVA - 10305 图的拓扑排序
- uva10304 Ordering-Tasks 拓扑排序
- UVA Ordering Tasks
- Ordering Tasks UVA - 10305
- ACM篇:Uva 10305----Ordering Tasks.cpp
- Ordering Tasks - UVa 10305 拓扑排序
- UVa 10305 (拓扑排序) Ordering Tasks
- Ordering Tasks UVA 10305
- lightoj1003 Drunk 、uva10305 Ordering Tasks (基于dfs的拓扑排序)
- sicily Ordering Tasks 拓扑排序
- Ordering Tasks UVA - 10305
- Ordering Tasks_拓扑_2018_2_23
- Restarting Web Services and Scheduled Tasks with a Batch File
- Effective C# Item 26: Implement Ordering Relations with IComparable and IComparer
- Project tasks assignment...
- strict weak ordering
- Siebel Admin: Asset-Based Ordering Quick Setting
- Ant有用的tasks