P1113 杂务
输入输出样例
输入 #1
7 1 5 0 2 2 1 0 3 3 2 0 4 6 1 0 5 1 2 4 0 6 8 2 4 0 7 4 3 5 6 0
输出 #1
23
思路
由主次关系可想到拓扑排序,跑一遍拓扑排序得到一种线性的工作方式,维护每个任务点时间花费的最大值即可
CODE
1 #include <bits/stdc++.h> 2 #define dbg(x) cout << #x << "=" << x << endl 3 #define eps 1e-8 4 #define pi acos(-1.0) 5 6 using namespace std; 7 typedef long long LL; 8 9 template<class T>inline void read(T &res) 10 { 11 char c;T flag=1; 12 while((c=getchar())<'0'||c>'9')if(c=='-')flag=-1;res=c-'0'; 13 while((c=getchar())>='0'&&c<='9')res=res*10+c-'0';res*=flag; 14 } 15 16 namespace _buff { 17 const size_t BUFF = 1 << 19; 18 char ibuf[BUFF], *ib = ibuf, *ie = ibuf; 19 char getc() { 20 if (ib == ie) { 21 ib = ibuf; 22 ie = ibuf + fread(ibuf, 1, BUFF, stdin); 23 } 24 return ib == ie ? -1 : *ib++; 25 } 26 } 27 28 int qread() { 29 using namespace _buff; 30 int ret = 0; 31 bool pos = true; 32 char c = getc(); 33 for (; (c < '0' || c > '9') && c != '-'; c = getc()) { 34 assert(~c); 35 } 36 if (c == '-') { 37 pos = false; 38 c = getc(); 39 } 40 for (; c >= '0' && c <= '9'; c = getc()) { 41 ret = (ret << 3) + (ret << 1) + (c ^ 48); 42 } 43 return pos ? ret : -ret; 44 } 45 46 const int maxn = 1e5 + 7; 47 48 int in[maxn], out[maxn]; 49 int val[maxn]; 50 int cost[maxn]; 51 int edge[maxn], head[maxn], nxt[maxn], cnt; 52 int n, ans; 53 54 void BuildGraph(int u, int v) { 55 cnt++; 56 edge[cnt] = v; 57 nxt[cnt] = head[u]; 58 head[u] = cnt; 59 } 60 61 void topo() { 62 queue <int> q; 63 for ( int i = 1; i <= n; ++i ) { 64 if(in[i] == 0) { 65 q.push(i); 66 cost[i] = val[i]; 67 } 68 } 69 while (!q.empty()) { 70 int u = q.front(); 71 q.pop(); 72 for(int i = head[u]; i; i = nxt[i]) { 73 int v = edge[i]; 74 cost[v] = max(cost[v], cost[u] + val[v]); 75 --in[v]; 76 if(!in[v]) { 77 if(!out[v]) { 78 ans = max(ans, cost[v]); 79 } 80 else { 81 q.push(v); 82 } 83 } 84 } 85 } 86 87 } 88 int main() 89 { 90 read(n); 91 for ( int i = 1; i <= n; ++i ) { 92 int id = 0, c = 0; 93 scanf("%d %d",&id, &c); 94 val[id] = c; 95 int x; 96 while(scanf("%d",&x) && x) { 97 BuildGraph(id, x); 98 out[id]++; 99 in[x]++; 100 } 101 } 102 topo(); 103 printf("%d\n",ans); 104 return 0; 105 }