奖学金【查分约束】

期末考试终于完了,老班决定召开班委会,内容嘛,则是可爱的奖学金的问题((*^__^*)),她叫来了一些班委,每位班委提出了自己的意见:“我认为同学a的奖学金应该比b多!”老班决定要找出一种奖学金方案,满足各位班委的意见,且同时使得总奖学金数最少。每位同学奖学金最少为100元且都为整数。

 

INPUT:

第一行两个整数n,m,表示同学总数和班委意见数;
以下m行,每行2个整数a,b,表示某个班委认为第a号同学奖学金应该比第b号同学高。

2 1

1 2

 1 int dfs(int s)
 2 {
 3     vis[s]=1;
 4     if(!flag)
 5         return 0;
 6     for(int i=linkk[s];i;i=e[i].y)
 7     {
 8         if(vis[e[i].x])
 9         {
10             flag=0;
11             return 0;
12         }
13         else
14             dfs(e[i].x);
15     }
16     vis[s]=0;
17 }

 

CPP:

  1 #include<iostream>
  2 #include<string>
  3 #include<algorithm>
  4 #include<cstring>
  5 #include<cstdio>
  6 #include<cmath>
  7 #include<iomanip>
  8 #include<queue>
  9 #include<vector>
 10 #include<cstring>
 11 using namespace std;
 12 const int maxn=500001;
 13 int n,m;
 14 int linkk[maxn],len=0;
 15 int id[maxn],dis[maxn],vis[maxn];
 16 int ans=-1;
 17 int q[maxn];
 18 bool flag=1;
 19 struct node
 20 {
 21     int x,y,v;
 22 }e[maxn];
 23 
 24 void init(int xx,int yy)
 25 {
 26     e[++len].y=linkk[xx];linkk[xx]=len;
 27     e[len].x=yy;e[len].v=1;
 28     id[yy]++;
 29 }
 30 
 31 void SPFA()
 32 {
 33     int head=0,tail=0;
 34     int maxx=0;
 35     for(int i=1;i<=n;i++)
 36         if(id[i]==0)
 37             q[++tail]=i;
 38     while(head<=tail)
 39     {
 40         int tn=q[++head];
 41         int te=linkk[tn];
 42         for(int i=te;i;i=e[i].y)
 43         {
 44             int tmp=e[i].x;
 45             id[tmp]--;
 46             if(id[tmp]<0)
 47             {
 48                 ans=-1;
 49                 cout<<"impossible"<<endl;
 50                 exit(0);
 51             }
 52             dis[tmp]=max(dis[tmp],dis[tn]+e[i].v);
 53             ans=max(ans,dis[tmp]);
 54             if(id[tmp]==0)
 55                 q[++tail]=tmp;
 56         }
 57     }
 58 }
 59 
 60 int dfs(int s)
 61 {
 62     vis[s]=1;
 63     if(!flag)
 64         return 0;
 65     for(int i=linkk[s];i;i=e[i].y)
 66     {
 67         if(vis[e[i].x])
 68         {
 69             flag=0;
 70             return 0;
 71         }
 72         else
 73             dfs(e[i].x);
 74     }
 75     vis[s]=0;
 76 }
 77 
 78 int main()
 79 {
 80     /*freopen("2.in","r",stdin);
 81     freopen("2.out","w",stdout);*/
 82     //ios::sync_with_stdio(false);
 83     cin>>n>>m;
 84     for(int i=1;i<=m;i++)
 85     {
 86         int x,y;
 87         cin>>x>>y;
 88         init(y,x);
 89     }
 90     for(int i=1;i<=n;i++)
 91     {
 92         if(id[i]==0)
 93         {
 94             dfs(i);
 95             if(!flag)
 96             {
 97                 cout<<"impossible"<<endl;
 98                 return 0;
 99             }
100         }
101     }
102     SPFA();
103     if(ans!=-1)
104     {
105         ans=0;
106         for(int i=n;i>0;i--)
107         {
108             ans=ans+dis[i];
109             //cout<<dis[i]<<endl;
110         }            
111         ans=ans+n*100;
112         cout<<ans<<endl;
113     }
114     else
115         cout<<"impossible"<<endl;
116     return 0;
117 }
View Code

 

 

OUTPUT:

201

 

思路:

一道显然的查分约束题;不可能的条件为有环(但不一定是负环);

所以要在SPFA之前用DFS先判断一下是否有环。(卡了我两天)!

核心:

转载于:https://www.cnblogs.com/zyker/p/6031024.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
1.学生需求 学生既是综合测评的对象,也是综合测评的主体。学生可以查询并维护自己的个人档案,同时参加其他同学的综合测评。学生对功能上的需求主要有: (1) 查询学校、学院、班级发布的种类消息和公告; (2) 查询课程信息和考试成绩; (3) 更新和维护自己的个人信息,查看其他同学的信息; (4) 查询自己的测评结果,查看本班测评结果统计信息。 2.管理员需求 管理员按身份级别可分为班委(测评小组)、辅导员、系统管理员四种级别。管理员除具备学生需求的功能外,按照不同身份还具备以下不同的权限。 (1) 班委:学生个人信息的录入和修改,各学期课程信息的录入和修改,学生综合测评结果的统计和修改。操作权限范围是本班同学。 (2) 辅导员:辅导员除了具备班委的权限外,还要负责对学生奖惩情况的核实,相关数据的维护。操作权限范围是本学院全体学生。 (3) 系统管理员:系统与管理员负责系统的管理维护,除具备上述所有功能外,管理员还负责数据备份与恢复、人员管理、权限设置等。 1.3.2系统子功能需求分析 本系统包括学生用户管理,数据库管理,学生信息管理,统计分析,报表的生成。根据所需功能要求包括以下的功能模块。 学生信息的管理:包括对学生信息的查询,修改,删除等更新。 课程信息的管理:对学生选修课程信息的查询,修改和删除等更新。 成绩信息的管理:对学生成绩信息的查询,修改和删除等更新。 统计分析:对成绩的分类统计,加以整合,以便得出综合评分标准。 报表生成:对评奖结果及其所需要的信息生成报表。 大概的子功能图:

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值