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;
} 

猜你喜欢

转载自blog.csdn.net/Nothing_227/article/details/81741645