标签:
Description
Input
Output
Sample Input
2 1 1 2 2 2 1 2 2 1
Sample Output
1777 -1
/*/ 题意: 老板发工资,但是老板很小气,但是至少每个人得发888元,而且,每个员工之间有业绩比较,业绩高的工资得高,至少多1元,问至少要发多少钱。 思路: 拓扑排序,查找有多少个不同等级的点,每个点的值与前面累加1; 计总和加上每个人888. 简单的拓扑排序,没必要多说了: AC代码: /*/
#include"algorithm" #include"iostream" #include"cstring" #include"cstdlib" #include"string" #include"cstdio" #include"vector" #include"cmath" #include"queue" using namespace std; #define memset(x,y) memset(x,y,sizeof(x)) #define memcpy(x,y) memcpy(x,y,sizeof(x)) #define MX 10005 int indegree[MX]; vector<int>next_v[MX]; void init() { for(int i=0; i<MX; i++) next_v[i].clear(); memset(indegree,0); } int toposort(int n) { int p[MX]; int cnt=0,money=0,num,summoney=n*888 ; while(cnt!=n) { num=0; for(int i=1; i<=n; i++) { if(!indegree[i]) { indegree[i]=-1; p[num]=i; num++; } } if(!num) {//没有员工,工资最高,不能排序,返回错误; return -1; } else { summoney+=money*num; money++; cnt+=num; //表示已经历遍了这么多个员工 for(int i=0; i<num; i++) { for(int j=0; j<next_v[p[i]].size(); j++) { indegree[next_v[p[i]][j]]--; } } } } return summoney; } int main() { int n,m,a,b; while(~scanf("%d%d",&n,&m)) { init(); for(int qq=0; qq<m; qq++) { scanf("%d%d",&a,&b); int flag=0; for(int i=0; i<next_v[b].size(); i++) { if(next_v[b][i]==a) flag=1; } if(!flag) { indegree[a]++; next_v[b].push_back(a); } } printf("%d\n",toposort(n)); } return 0; }
标签:
原文地址:http://www.cnblogs.com/HDMaxfun/p/5741860.html