题意:给出一个n表示(1~n人)和一个m,下面m行输入a,b,表示a的排名比b高.
保证一定且只有一种结果----输出满足m组要求的字典数最小的排名顺序
题解:该题数据较小可试一手拓扑排序-邻接矩阵写法,不过要注意该题存在重边.(邻接表的话不用考虑重边的情况)
代码如下:
#include<iostream>
#include<cstring>
#include<string>
#include<cstdio>
#include<cmath>
#include<vector>
#include<queue>
#include<map>
#include<algorithm>
using namespace std;
#define ll long long
#define inf 0x3f3f3f3f
#define maxn 550
int mp[maxn][maxn];
int in[maxn];//入度
int n, m, cnt;
int ans[maxn];
void topo_sort()
{
int tmp;
for (int i = 0; i < n; i++)
{
for (int j = 1; j <= n; j++)
{
if (in[j] == 0)
{
tmp = j;
ans[cnt++] = j;
in[j]--; //即将入度改为-1,下次不会再使用该点
break; //保证了存在多种结果时输出字典数最小
}
}
for (int j = 1; j <= n; j++)
{
if (mp[tmp][j] == 1)
in[j]--;
//修改成in[j] -= mp[tmp][j];下面添加add时改为mp[a][b]++;即可不考虑重边
}
}
}
int main()
{
while (~scanf("%d%d", &n, &m))
{
memset(in, 0, sizeof(in));
memset(mp, 0, sizeof(mp));
cnt = 0;
int a, b;
for (int i = 0; i<m; i++)
{
scanf("%d%d", &a, &b);//添加边a->b
if (mp[a][b] == 0)//确保无重边
{
in[b]++;
mp[a][b] = 1;
}
}
topo_sort();
for (int i = 0; i < n; i++)
printf("%d%c", ans[i], i == n - 1 ? '\n' : ' ');
}
return 0;
}