UVA 10305 给任务排序
-
思路
刚看到的时候,第一想法是:我之前是不是做过这个,翻了翻之前的文章,确实有个拓扑排序的,不过之前用的是dp的办法,参见 杂物 , 这次看了看,没法再用dp了,老老实实的用拓扑排序把....
对拓扑排序的理解参考了 38图的拓扑排序问题及算法讲解
-
知识点
是的,我也是第一次看
- 名词
- AOV网:顶点表示活动,用有向边表示活动之间的优先关系的有向图
- 不允许出现环
- 若<vi,ji>是途中的有向边,则vi是ji的直接前驱,ji是vi的直接后继
- 拓扑排序:将AOV网中所有顶点按照优先级关系排成一个线性序列dd额过程
- 拓扑排序所得到的序列
- AOV网:顶点表示活动,用有向边表示活动之间的优先关系的有向图
- 排序方法:重点
- 再有向图中选一个没有入度(直接前驱)的顶点输出
- 从图中删除该顶点和和这个顶点有关的所有弧
- 重复以上步骤,直到所有顶点已经输出或者不存在无前驱的结点为止(出现环了)
- 名词
注水代码:
ps:这次代码没经过检测,也没判环,应该是无法ac的
#include<iostream>
#include<vector>
#include<queue>
using namespace std;
vector<int> vs[105];
int n,m,u,v,topo[105],t;
void init(){
for(int i=0;i<=100;i++){
vs[i].clear();
topo[i] = 0;
}
}
void bfs(){
queue<int> qs;
for(int i=1;i<=n;i++)
if(topo[i]==0)qs.push(i);
while(!qs.empty()){
t = qs.front();
qs.pop();
for(int i=0;i<vs[t].size();i++){
if(--topo[vs[t][i]]==0)qs.push(vs[t][i]);
}
cout<<t<<" ";
}
}
int main(){
freopen("data.in","r",stdin);
while(cin>>n>>m&&n){
init();
for(int i=0;i<m;i++){
cin>>u>>v;
vs[u].push_back(v);
topo[v]++;
}
bfs();
}
return 0;
}