sgu230:Weighings(拓扑)

来源:互联网 发布:java代码换行 编辑:程序博客网 时间:2024/06/06 13:19

题目大意:
      n个硬币质量分别为1,2n,还有n个盒子。将所有硬币放入所有盒子中并要求满足m个形如A中的硬币质量小于B中的硬币质量的限制条件,要求输出一种满足条件的方案即每个盒子中放的是哪个硬币,如果误解输出No solution

分析:
      裸的拓扑排序。。。

AC code:

#include <cstdio>#include <cstring>#define ONLINE_JUDGEusing namespace std;const int MAXN = 109, MAXM = 10009;int n, m;struct Dgraph{    int size;    int head[MAXN];    int to[MAXM];    int ne[MAXM];    Dgraph(){size = 1;}    void add_edge(int u, int v)    {        to[size] = v, ne[size] = head[u], head[u] = size++;    }}G;int q[MAXN], l, r;int in[MAXN];int ans[MAXN], tot;int main(){    #ifndef ONLINE_JUDGE    freopen("sgu230.in", "r", stdin);    freopen("sgu230.out", "w", stdout);    #endif    scanf("%d%d", &n, &m);    for(int i = 1; i <= m; ++i)    {        int u, v;        scanf("%d%d", &u, &v);        G.add_edge(u, v), in[v]++;    }    for(int i = 1; i <= n; ++i)        if(!in[i]) q[++r] = i;    while(l < r)    {        int u = q[++l];        ans[u] = l;        for(int i = G.head[u]; i; i = G.ne[i])        {            int v = G.to[i];in[v]--;            if(!in[v]) q[++r] = v;        }    }    if(r < n) puts("No solution");    else    {        printf("%d", ans[1]);        for(int i = 2; i <= n; ++i)            printf(" %d", ans[i]);        puts("");    }    #ifndef ONLINE_JUDGE    fclose(stdin);    fclose(stdout);    #endif    return 0;}
0 0
原创粉丝点击