zoukankan      html  css  js  c++  java
  • 拓扑排序 codevs 4040 cojs 438

    codevs 4040 EZ系列之奖金

     时间限制: 1 s
     空间限制: 64000 KB
     题目等级 : 钻石 Diamond
    题目描述 Description

    由于无敌的WRN在2015年世界英俊帅气男总决选中胜出,EZ总经理Mr.Lin心情好,决定给每位员工发奖金。EZ决定以每个人本年在EZ的贡献为标准来计算他们得到奖金的多少。

    于是Mr.Lin下令召开m方会谈。每位参加会谈的代表提出了自己的意见:“我认为学生a的奖金应该比b高!”Mr.Lin决定要找出一种奖金方案,满足各位代表的意见,且同时使得总奖金数最少。每位学生奖金最少为100元。

    输入描述 Input Description

    第一行两个整数n,m,表示学生总数和代表数;

    以下m行,每行2个整数a,b,表示某个代表认为第a号学生奖金应该比第b号学生高。

    输出描述 Output Description

    若无法找到合法方案,则输出“-1”;否则输出一个数表示最少总奖金。

    样例输入 Sample Input

    2 1

    1 2

    样例输出 Sample Output

    201

    数据范围及提示 Data Size & Hint

    80%的数据满足n<=1000,m<=2000;

    100%的数据满足n<=10000,m<=20000。

     1 #include<iostream>
     2 #define inf (1<<31)-1
     3 using namespace std;
     4 #include<cstdio>
     5 typedef long long ll;
     6 #include<cstring>
     7 #define N 10010
     8 #include<stack>
     9 stack<int>sta;
    10 struct Edge{
    11     int v,last;
    12 }edge[N<<1];
    13 ll ans=0;
    14 int indu[N],head[N],t=0,u,tot=0,v,n,m;
    15 void add_edge(int u,int v)
    16 {
    17     ++t;
    18     edge[t].v=v;
    19     edge[t].last=head[u];
    20     head[u]=t;
    21 }
    22 int read()
    23 {
    24     int sum=0,ff=1;char s;
    25     s=getchar();
    26     while(s<'0'||s>'9')
    27     {
    28         if(s=='-') ff=-1;
    29         s=getchar();
    30     }
    31     while('0'<=s&&s<='9')
    32     {
    33         sum=sum*10+s-'0';
    34         s=getchar();
    35     }
    36     return sum*ff;
    37 }
    38 void input()
    39 {
    40     n=read();m=read();
    41     for(int i=1;i<=m;++i)
    42     {
    43         v=read();u=read();
    44         add_edge(u,v);
    45         indu[v]++;
    46     }
    47 }
    48 bool toposort()
    49 {
    50     int mon=0;
    51     while(tot<n)
    52     {
    53         for(int i=1;i<=n;++i)
    54         {
    55             if(!indu[i])
    56             {
    57                 ans+=100+mon;
    58                 sta.push(i);
    59                 indu[i]=inf;
    60                 tot++;
    61             }
    62         }
    63         if(sta.empty()) return false;
    64         while(!sta.empty())
    65         {
    66             int topt=sta.top();
    67             sta.pop();
    68             for(int l=head[topt];l;l=edge[l].last)
    69             {
    70                 indu[edge[l].v]--;
    71             }
    72         }
    73         mon++;
    74     }
    75     return true;
    76 }
    77 int main()
    78 {
    79     input();
    80     if(toposort())
    81     {
    82         cout<<ans<<endl;
    83     }
    84     else printf("-1
    ");
    85     return 0;
    86 }

    cojs 438. 烦人的幻灯片

    ★☆   输入文件:slides.in   输出文件:slides.out   简单对比
    时间限制:1 s   内存限制:128 MB

    【问题描述

    李教授将于今天下午作一次非常重要的演讲。不幸的是他不是一个非常爱整洁的人,他把自己演讲要用的幻灯片随便堆在了一起。因此,演讲之前他不得不去整理这些幻灯片。做为一个讲求效率的学者,他希望尽可能简单地完成它。教授这次演讲一共要用n张幻灯片(n≤26),这n张幻灯片按照演讲要使用的顺序已经用数字l,2,…,n在上面编了号。因为幻灯片是透明的,所以我们不能一下子看清每一个数字所对应的幻灯片。
    现在我们用大写字母A,B,C,…再次把幻灯片依次编号。你的任务是编写一个程序,把幻灯片的数字编号和字母编号对应起来,显然这种对应应该是惟一的;若是出现多种对应的情况或是某些数字编号和字母编号对应不起来,我们就称对应是无法实现的。
    输入格式】
    幻灯片的情况通过一个文本文件slides.in输入。
    文件的第1行只有一个整数n,表示有n张幻灯片,接下来的n行每行包括4个整数Xmin,Xmax,Ymin,Ymax(整数之间用空格分开)为幻灯片的坐标,这n张幻灯片按其在输入文件中出现的顺序从前到后依次编号为A,B,C,…
    再接下来的n行依次为n个数字编号的坐标x,y,显然在幻灯片之外是不会有数字的。
     
    输出格式】
    要求将程序的运行结果写入一个名为slides.out的文本文件。若是对应可以实现,输出文件应该包括n行,每一行为一个字母和一个数字,中间以一个空格隔开,并且各行以字母的升序排列,注意输出的字母要大写并且顶格;反之,若是对应无法实现,在文件的第1行顶格输出None即可。行首行末并无多余的空格。
    输入输出样例】
    输 入
    4
    6 22 10 20
    4 18 6 16
    8 20 2 18
    10 24 4 8
    9 15
    19 17
    11 7
    21 11
    输 出
    A 4
    B 1
    C 2
    D 3
    这道题目类似于拓扑排序的思想:
     1 #define N 30
     2 #include<vector>
     3 #include<iostream>
     4 using namespace std;
     5 #include<cstdio>
     6 #include<algorithm>
     7 struct Edge{
     8     int u;
     9     vector<int>a;
    10     bool operator <(const Edge&p)
    11     const{return a.size()<p.a.size();}
    12 }bh[N];
    13 struct Kp{
    14     int x1,x2,y1,y2;
    15 }kp[N];
    16 int flag[N],t=0,tot=0,n;
    17 void input()
    18 {
    19     scanf("%d",&n);
    20     for(int i=1;i<=n;++i)
    21     {
    22         scanf("%d%d%d%d",&kp[i].x1,&kp[i].x2,&kp[i].y1,&kp[i].y2);
    23     }
    24 //    memset(flag,0,sizeof(flag));
    25 }
    26 void add_edge(int u,int v)
    27 {
    28     bh[u].u=u;
    29     bh[u].a.push_back(v);
    30 }
    31 void add()
    32 {
    33     int xi,xa,yi,ya;
    34     for(int i=1;i<=n;++i)
    35     {
    36         scanf("%d%d",&xi,&yi);
    37         for(int j=1;j<=n;++j)
    38         {
    39             if(xi>=kp[j].x1&&xi<=kp[j].x2&&yi>=kp[j].y1&&yi<=kp[j].y2)
    40             {
    41                 add_edge(i,j);
    42             }
    43         }
    44     }
    45 }
    46 int main()
    47 {
    48     freopen("slides.in","r",stdin);
    49     freopen("slides.out","w",stdout);
    50     input();
    51     add();
    52     sort(bh+1,bh+n+1);
    53     for(int i=1;i<=n;++i)
    54     {
    55         for(int j=0;j<bh[i].a.size();++j)
    56         {
    57             if(flag[bh[i].a[j]]==0)
    58             {
    59                 int temp=bh[i].a[j];
    60                 flag[bh[i].a[j]]=bh[i].u;
    61                 tot++;
    62                 break;
    63             }
    64         }
    65     }
    66     int tbflag[N]={0};
    67     for(int i=1;i<=n;++i)
    68     {
    69         for(int j=bh[i].a.size()-1;j>=0;--j)
    70         {
    71             if(tbflag[bh[i].a[j]]==0)
    72             {
    73                 int temp=bh[i].a[j];
    74                 tbflag[bh[i].a[j]]=bh[i].u;
    75                 break;
    76             }
    77         }
    78     }
    79     bool fla=true;
    80     for(int i=1;i<=n;++i)/*再反着做一次,是确保结果唯一的*/
    81     {
    82         if(tbflag[i]!=flag[i])
    83         {
    84             fla=false;break;
    85         }
    86     }
    87     if(tot==n&&fla)
    88     {
    89         for(int i=1;i<=n;++i)
    90         {
    91             printf("%c %d
    ",i+'A'-1,flag[i]);
    92         }
    93     }
    94     else {
    95         printf("None
    ");
    96     }
    97     fclose(stdin);fclose(stdout);
    98     return 0;
    99 }
  • 相关阅读:
    (转)大型网站架构演化发展历程
    Android编译错误, Ignoring InnerClasses attribute for an anonymous inner class
    (转)写让别人能读懂的代码
    JVectorMap地图插件.Net版开源
    (转)淘宝技术发展
    (转)史上最全的MSSQL复习笔记
    (转)jieba中文分词的.NET版本:jieba.NET
    (转)微软牛津计划介绍——屌爆了的自然数据处理解决方案(人脸/语音识别,计算机视觉与语言理解)
    (转)分布式中使用Redis实现Session共享(二)
    (转)分布式中使用Redis实现Session共享(一)
  • 原文地址:https://www.cnblogs.com/c1299401227/p/5559000.html
Copyright © 2011-2022 走看看