reward

关键点是每一次点度数减1后,要即时更新其奖金值。。 用邻接矩阵写超时,学了下用STL vector写邻接表。用stl真的非常方便但是非常要时间啊

 1 #include <stdio.h>
2 #include <string.h>
3 #include <stdlib.h>
4 #include <vector>
5 #include <stack>
6
7 using namespace std;
8
9 int N, M, i, j ,t1, t2, sum ,l, a, b;
10 int dp[10010],exp[10010];
11
12 void init( )
13 {
14
15 for (i = 0; i <= 10000; i++)
16 exp[i] = 888;
17
18 }
19
20 int max(int x, int y)
21 {
22 return x > y ? x : y;
23 }
24
25 int main( )
26 {
27
28 while (scanf("%d%d", &N, &M)!= EOF) {
29 init( );
30 memset(dp, 0, sizeof(dp));
31 sum = 0, l = 0;
32 stack<int>q;
33 vector<int>T[10010];
34 for (i = 1; i <= M; i++) {
35 scanf("%d%d", &a, &b);
36 T[b].push_back(a);
37 dp[a]++;
38 }
39 for (i = 1; i <= N; i++)
40 if (dp[i] == 0) {
41 q.push(i);
42 sum += exp[i];
43 // printf("sum :%d exp[%d] : %d\n",sum,i,exp[i]);
44 dp[i] = -1;
45 l++;
46 }
47
48 if (l == 0) {
49 printf("-1\n");
50 continue;
51 }
52 //puts("**");
53 while (!q.empty()) {
54 t1 = q.top();
55 q.pop( );
56 for (j = 0; j < T[t1].size( ); j++) {
57 t2 = T[t1][j];
58 dp[t2]--;
59 exp[t2] = max(exp[t1]+1,exp[t2]);
60 }
61 for (i = 1; i <= N; i++)
62 if (dp[i] == 0) {
63 q.push(i);
64 sum += exp[i];
65 // printf("sum :%d exp[%d] : %d\n",sum,i,exp[i]);
66 dp[i] = -1;
67 l++;
68 }
69 }
70 //printf("%d\n",l);
71 if(l == N)
72 printf("%d\n",sum);
73 else
74 printf("-1\n");
75 }
76 return 0;
77 }
78
79
80
81
82

  

posted on 2011-07-20 10:59  more think, more gains  阅读(234)  评论(0编辑  收藏  举报

导航