您的位置:首页 > 其它

例题 6-15 UVA 10305 Ordering Tasks 给任务排序

2016-02-22 18:46 489 查看
简单记录下 书中的方法:

建立一个c数组表示访问的状态,-1为正在访问,1表示访问完毕,0表示未访问。

G[u][v]表示u < v在输入中出现过。

然后遍历U, 对u进行dfs,dfs的方式是从1到n在来一遍,依次进行。

之所以数组倒着写,是因为输入的肯定是dfs最深的,最深的也是最大的,要放在面!

#include<cstdio>
#include<cstring>
const int maxn = 100 + 10;
int c[maxn],G[maxn][maxn],ans[maxn];
int n,m,t;
bool dfs(int u){
c[u] = -1;// visiting
for (int i = 1; i <= n; ++i){
if (G[u][i]){
if (c[i] == -1)return false;
else if (!c[i] && !dfs(i))return false;
}
}
c[u] = 1;ans[--t]=u;
return true;
}
bool solve(){
t = n;
memset(c,0,sizeof(c));
for (int i = 1; i <= n; ++i)if (!c[i])
if (!dfs(i))return false;
return true;
}
int main()
{
while(scanf("%d%d",&n,&m) == 2 && (n || m)){
int a,b;
memset(G,0,sizeof(G));
for (int i = 1; i <= m; ++i){
scanf("%d%d",&a,&b);
G[a][b] = 1;
}
solve();
for (int i = 0;i < n; ++i)printf("%s%d",i?" ":"",ans[i]);
printf("\n");
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: