题意:工厂发工资,最低工资是888元,然后比他高一层得人的工资是889,依次类推
因为是从工资低的人推到工资高的人,所以反向建图
然后就是自己写的时候犯的错误,以为工资是后一个人比前一个人高1元,然后就直接判断是否能形成拓扑序列之后,用n*888+(n-1)*n/2来算了
这样不对,是后一层的工资比前一层得工资多1元,用一个数组记录下来钱就可以了
1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include <cmath> 5 #include<stack> 6 #include<vector> 7 #include<map> 8 #include<set> 9 #include<queue> 10 #include<algorithm> 11 using namespace std; 12 13 #define foreach(i,c) for (__typeof(c.begin()) i = c.begin(); i != c.end(); ++i) 14 15 typedef long long LL; 16 const int INF = (1<<30)-1; 17 const int mod=1000000007; 18 const int maxn=100005; 19 20 int ans[maxn],nextt[maxn],firstt[maxn],in[maxn],e[maxn],money[maxn]; 21 int n,m,ecnt; 22 int tot; 23 24 void toposort(){ 25 queue<int> q; 26 for(int i=1;i<=n;i++) 27 if(in[i]==0) q.push(i); 28 29 tot=0; 30 int cnt=0; 31 while(!q.empty()){ 32 int tmp=q.front();q.pop(); 33 ans[++cnt]=tmp; 34 tot+=money[tmp]; 35 36 for(int k=firstt[tmp];k!=-1;k=nextt[k]){ 37 in[e[k]]--; 38 if(in[e[k]]==0) { 39 money[e[k]]=money[tmp]+1; 40 q.push(e[k]); 41 } 42 } 43 } 44 45 if(cnt==n) printf("%d\n",tot); 46 else printf("-1\n"); 47 } 48 49 void addedges(int u,int v){ 50 e[++ecnt]=v; 51 nextt[ecnt]=firstt[u]; 52 firstt[u]=ecnt; 53 in[v]++; 54 } 55 56 57 int main(){ 58 while(scanf("%d %d",&n,&m)!=EOF){ 59 60 ecnt=0; 61 memset(in,0,sizeof(in)); 62 memset(firstt,-1,sizeof(firstt)); 63 for(int i=1;i<=n;i++) money[i]=888; 64 65 while(m--){ 66 int u,v; 67 cin>>u>>v; 68 addedges(v,u); 69 } 70 toposort(); 71 } 72 return 0; 73 }
时间: 2024-10-08 19:35:18