拓补排序(板子)

墨春

关注

阅读 57

2022-03-11

题目点这里!!!

先排序,因为是按字典序排,用vector和二维数组存边各有好处,看情况,

二维数组存:
1.可以直接查找现在这条边,

2.可以记录对应的出度入度

vector存:

1.可以直接套着访问下条边

2.耍酷!!!

// 板子 

#include <iostream>
#include <vector>
#include <cstring>
#include <algorithm>
using namespace std;
int edge[100][100];
int cnt = 0;
int num[40];
int outdu[40];
char jl[40];
int vis[40];
int len;

void Tuobu(int pos)
{
	if (pos == len + 1)
	{
		for (int i = 1; i <= len; ++i)
		{
			cout << jl[i];
		}
		cout << endl;
		return ;
	}
	for (int i = 1; i <= len; ++i)
	{
		if (!vis[num[i]] && outdu[num[i]] == 0)
		{
			jl[pos] = num[i] + 'a';
			vis[num[i]] = 1;
			for (int j = 1; j <= len; ++j)
			{
				if (!vis[num[j]] && edge[num[i]][num[j]] == 1)
				{
					outdu[num[j]]--;
				}
			}
			Tuobu(pos + 1);
			vis[num[i]] = 0;
			for (int j = 1; j <= len; ++j)
			{
				if (!vis[num[j]] && edge[num[i]][num[j]] == 1)
				{
					outdu[num[j]]++;
				}
			}
		}
	}
	
}

int main()
{
	ios::sync_with_stdio(false);
	cin.tie(0), cout.tie(0);
	string s;
	while (getline(cin, s))
	{
		memset(edge, 0, sizeof edge);
		memset(num, 0, sizeof num);
		memset(outdu, 0, sizeof outdu);
		memset(vis, 0, sizeof vis);
		for (int i = 0; i < s.length(); ++i)
		{
			if (s[i] != ' ')
			{
				num[++cnt] = s[i] - 'a';
			}
		}
		sort(num + 1, num + 1 + cnt);
		len = cnt;
		getline(cin, s);
		cnt = 0;
		for (int i = 0; i < s.length(); ++i)
		{
			int temp[3];
			if (s[i] != ' ')
			{
				temp[++cnt] = s[i] - 'a';
			}
			if (cnt == 2)
			{
				edge[temp[1]][temp[2]] = 1;
				outdu[temp[2]]++;
				cnt = 0;
			}
		}
		Tuobu(1);
		cout << endl;
	}
	return 0;
}

精彩评论(0)

0 0 举报