Ordering task UVA 10305

John has n tasks to do. Unfortunately, the tasks are not independent and the execution of one task is only possible if other tasks have already been executed.

Input

The input will consist of several instances of the problem. Each instance begins with a line containing two integers, 1 ≤ n ≤ 100 and m. n is the number of tasks (numbered from 1 to n) and m is the number of direct precedence relations between tasks. After this, there will be m lines with two integers i and j, representing the fact that task i must be executed before task j. An instance with n = m = 0 will finish the input.

Output

For each instance, print a line with n integers representing the tasks in a possible order of execution.

Sample Input

5 4

1 2

2 3

1 3

1 5

0 0

Sample Output

1 4 2 5 3

这题我一开始就直接用的邻接表来存储,但不知道为什么一直WA,很难受。都快疯了,用邻接矩阵,居然就过了难受的一匹!!!有没有路过的大神 帮我解释一下…………………………………………………………………………

#include <bits/stdc++.h>
using namespace std;
const int maxn = 1e3+5;
int m,n,a,b,i,j,cnt;
int du[maxn],path[maxn],Map[maxn][maxn];
vector<int > vec[maxn];

void topsort()
{
    cnt = 0;
    queue<int > q;
    while(!q.empty()) q.pop();
    for(i = 1; i <= n; i++)
        if(du[i] == 0)
            q.push(i);
    while(!q.empty())
    {
        int temp = q.front();
        q.pop();
        path[cnt++] = temp;
        //这个是邻接矩阵的
        for(i = 1; i <= n; i++)
            if(Map[temp][i])
                if(--du[i] == 0)
                    q.push(i);
        //这个邻接表
       /* int l = vec[temp].size();
        for(i = 0; i < l; i++)
        {
            int item = vec[temp][i];
            if(--du[item] == 0)
                q.push(item);
        }*/
    }
}
int main()
{
    while(scanf("%d %d",&n,&m)&&(n||m))
    {
        memset(du,0,sizeof du);
        memset(path,0,sizeof path);
        memset(Map,0,sizeof Map);
        for(i = 1; i <= n; i++ )
            if(!vec[i].size() )
                vec[i].clear();
        for(i = 1; i <= m; i++)
        {
            scanf("%d %d",&a,&b);
            du[b]++;
            //vec[a].push_back(b);
            Map[a][b] = 1;
        }
        topsort();
        for(i = 0; i < cnt-1; i++)
            printf("%d ",path[i]);
        printf("%d\n",path[cnt-1]);
    }
    return 0;
}

DFS篇

#include <bits/stdc++.h>
using namespace std;
#define mem(a,b) memset(a,b,sizeof a)
const int maxn = 1e3+5;
int c[maxn],topo[maxn],Map[maxn][maxn];
int n,m,a,b,i,t;

bool dfs(int u)
{
	c[u] = -1; //表示该点正在栈帧里面
	for(int j = 1; j <= n; j++) //刚开始设的j是全局变量,在递归时出错了 
		if(Map[u][j]) 
		{
			if( c[j] < 0)//说明还没有出来就又要进去了,故存在环 
				return false;
			if(!c[j]/*就是为0时就递归*/&&!dfs(j))
				return false; 
		}
	c[u] = 1;
	topo[t--] = u; //因为递归最先出来是最后一个啊,所以倒着来咯,正着也行; 
	return true; 
}
bool toposort()
{
	t = n;
	for(int u = 1; u <= n; u++)
		if(!c[u])//是否进去过 
			if(!dfs(u))
				return false;
	return true;
} 

int main()
{
	while(scanf("%d%d",&n,&m)&&(n||m))
	{
		mem(c,0);
		mem(topo,0);
		mem(Map,0);
		for(i = 0; i< m ;i++)
		{
			scanf("%d%d",&a,&b);
			Map[a][b] = 1;
		}
		toposort();
		for(i = 1; i < n; i++)
			printf("%d ",topo[i]);
		printf("%d\n",topo[n]);
	}
	return 0;
} 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值