HDU 2647 Reward(拓扑排序)

题意:春节来临给员工发工资,有n名员工,m个要求,每个要求是 a b,意思a的工资要比b多。每个员工最低工资是888.问总共发放工资的最低是多少?
思路:从最低工资拓扑排序.排序的方向就是从低到高,(开始方向建错,W好几发)。最低888,依次+1,没有要求就是统一等级。

#include<bits/stdc++.h>
using namespace std;
int v[10010],ans[10010],vis[10010];
vector<int>M[10010];
int main()
{
    int n,m;
    while(~scanf("%d%d",&n,&m)){
      for(int i=1;i<=n;i++) M[i].clear();
      memset(v,0,sizeof(v));
      memset(vis,0,sizeof(vis));
      for(int i=0;i<m;i++){
        int flag=0;
        int a,b;scanf("%d%d",&a,&b);
        M[b].push_back(a);
        v[a]++;
      }
      int t=0,ok=1,num,tt=0;
      int res=0;
      while(t<n){
         vector<int>temp;
         num=0;
         for(int i=1;i<=n;i++){
           if(!vis[i]&&v[i]==0){
               num++; vis[i]=1;
               temp.push_back(i);
           }
         }
         for(int i=0;i<temp.size();i++){
            for(int j=0;j<M[temp[i]].size();j++)  if(!vis[M[temp[i]][j]] )v[M[temp[i]][j]]--;
         }
         if(num==0){ok=0;break;}
         res+=(888+tt)*num;tt++;
         t+=num;
         //cout<<"t="<<t<<endl;
       }
       if(!ok){
          printf("-1\n");
          continue;
       }
       printf("%d\n",res);
    }
}

你可能感兴趣的:(HDU 2647 Reward(拓扑排序))