吃在工大

来源:互联网 发布:数据质量问题分类 编辑:程序博客网 时间:2024/04/27 14:36

吃在工大
题目描述:
Description

JH和他的好朋友YZ两名程序员回访母校合工大,
JH又是一名典型吃货,于是决定在工大食堂好好吃一段日子,
但是,面对美食诱惑:黄焖鸡、风暴干锅、麻辣香锅、
奥尔良烤翅…由于时间有限,JH不知道哪顿饭吃哪个菜好。
于是YZ为了帮助他解决这个问题,也顺便考考他,给他出了一个问题:“黄焖鸡必须在干锅花菜前面吃,干锅牛肉必须在干锅鱿鱼前面吃….你按这个要求下,就知道吃的顺序啦”。JH抓抓头,分分钟写了个程序搞定,现在,让你来写写看?输出一组JH符合条件下吃的食物的序列。
假设JH每顿只吃一种食物,且每顿吃的都不同,食物编号1到N。

Input

     先输入一个整数T,表示T(T<50)组数据。

每组数据第一行输出一个整数,N,M,分别表示有N种食物,总共有M个约束条件,接下来M行每行输入两个正整数a,b(n>=a>0,n>=b>0),表示食物a必须在食物b之前吃。

Output

     各组数据输出答案占一行,输出一组符合条件的序列(要求输出字典序最大的那一组),如果答案不存在,输出“-1”。

Sample Input

1
4 3
1 2
2 3
4 3

Sample Output

4 1 2 3

题意分析:现在有n种食物,m种约定。a,b表示食物a必须在食物b之前吃,求吃食物的序列,并且要求输出字典序最大的一组,如果答案不存在,则输出“-1”。这是一道很明显的拓扑排序题目,比赛的时候,一下就发现了,然后就开始敲,敲完后发现,有些不对,这个图可能不包含所有的顶点,然后就继续想,真是傻啊!!!把没有出现在图中的顶点(也就是没有约束的顶点)的入度设置为0,这样就可以把这些顶点在第一遍的时候放入优先队列了。然后就是拓扑排序就ok了!
代码:

#include<stdio.h>#include<iostream>#include<algorithm>#include<queue>#include<vector>#include<string.h>using namespace std;const int N =10000;int n,m,L[N],du[N];vector<int>g[N];bool toposort(){    int tot=0;    memset(du,0,sizeof(du));    for(int i=0;i<n;i++)        for(int j=0;j<g[i].size();j++)        du[g[i][j]]++;    priority_queue<int>que;    for(int i=0;i<n;i++)        if(du[i]==0)        que.push(i);    while(!que.empty())    {        int x=que.top();        que.pop();        L[tot++]=x;        for(int i=0;i<g[x].size();i++)        {            int u=g[x][i];            du[u]--;            if(!du[u])                que.push(u);        }    }    if(tot==n)return true;    else return false;}int main(){    int t;    scanf("%d",&t);    while(t--)    {        scanf("%d%d",&n,&m);        for(int i=0;i<n;i++)            g[i].clear();        while(m--)        {            int a,b;            scanf("%d%d",&a,&b);            g[a-1].push_back(b-1);        }        bool ans=toposort();            if(!ans)            printf("-1\n");            else            {            for(int i=0;i<n;i++)                if(i==n-1)                printf("%d\n",L[i]+1);            else printf("%d ",L[i]+1);            }    }    return 0;}
0 0
原创粉丝点击