标签:open tac pre one amp com 图片 拓扑排序 out
1.家谱树
寻寻有一个大家庭,辈分关系很混乱,请你帮他梳理一下家庭成员的关系。
输入:
第一行n,表示共5个人。
接下来的n行,第i行表示第i个人的孩子。
每行以0结束。
输出:
一行序列,空格隔开,使得每个人的后辈都比那个人后出现。
spj
#include<iostream> #include<cstdio> #include<cmath> #include<cstring> #include<algorithm> #include<queue> #include<cstdlib> #include<stack> using namespace std; int n,cnt,ru[10005],hd[10005],ans, x,t,y; stack<int> q; struct Edge{ int to, nxt; }edge[1000005]; void add(int u, int v){ cnt++; edge[cnt].to = v; edge[cnt].nxt = hd[u]; hd[u] = cnt; } int main(){ scanf("%d",&n); for(int i = 1; i <= n; i++){ while(~scanf("%d",&y)){ if(y == 0) break; add(i,y); ru[y]++; } } int mx = 0; for(int i = 1; i <= n; i++) if(ru[i] == 0){ q.push(i); } while(!q.empty()){ int u = q.top(); q.pop(); printf("%d ",u); for(int i = hd[u]; i; i = edge[i].nxt){ int v = edge[i].to; ru[v]--; if(!ru[v]){ q.push(v); } } } return 0; } /* 5 0 4 5 0 1 0 5 3 0 3 0 */
题解:递推关系
#include<iostream> #include<cstdio> #include<cmath> #include<cstring> #include<algorithm> #include<queue> #include<cstdlib> #include<stack> using namespace std; int n,cnt,at[10005],ru[10005],hd[10005],ans, x,t,y, f[10005]; stack<int> q; struct Edge{ int to, nxt; }edge[1000005]; void add(int u, int v){ cnt++; edge[cnt].to = v; edge[cnt].nxt = hd[u]; hd[u] = cnt; } int main(){ scanf("%d",&n); for(int i = 1; i <= n; i++){ scanf("%d%d",&x,&t); at[x] = t; while(~scanf("%d",&y)){ if(y == 0) break; add(y,x); ru[x]++; } } int mx = 0; for(int i = 1; i <= n; i++) if(ru[i] == 0){ q.push(i); f[i] = at[i]; } while(!q.empty()){ int u = q.top(); q.pop(); for(int i = hd[u]; i; i = edge[i].nxt){ int v = edge[i].to; ru[v]--; if(!ru[v]){ q.push(v); } f[v] = max(f[v], f[u] + at[v]); } } for(int i = 1; i <= n; i++) ans = max(ans, f[i]); printf("%d\n",ans); return 0; } // #include<iostream> // #include<cstdio> // #include<cmath> // #include<cstring> // #include<algorithm> // #include<queue> // #include<cstdlib> // #include<stack> // using namespace std; // int n,cnt,at[10005],ru[10005],hd[10005],ans, x,t,y, vis[10005]; // stack<int> q; // struct Edge{ // int to, nxt; // }edge[1000005]; // void add(int u, int v){ // cnt++; // edge[cnt].to = v; // edge[cnt].nxt = hd[u]; // hd[u] = cnt; // } // int main(){ // scanf("%d",&n); // for(int i = 1; i <= n; i++){ // scanf("%d%d",&x,&t); // at[x] = t; // while(~scanf("%d",&y)){ // if(y == 0) break; // add(y,x); // ru[x]++; // } // } // int fl; // while(1){ // int mx = 0, fl = 0; // cout<<"u:"<<endl; // for(int u = 1; u <= n; u++){ // if(!ru[u] && !vis[u]){ // q.push(u); // if(at[u] > mx) mx = at[u]; // fl = 1; // vis[u] = 1; // cout<<u<<" "; // } // } // // cout<<endl; // if(!fl) break; // ans += mx; // cout<<"mx:"<<mx<<" ans: "<<ans<<endl; // cout<<"v:"<<endl; // while(!q.empty()){ // int u = q.top(); q.pop(); // for(int i = hd[u]; i; i = edge[i].nxt){ // int v = edge[i].to; // ru[v]--; // cout<<v<<" "; // } // } // cout<<endl; // } // printf("%d\n",ans); // return 0; // }
标签:open tac pre one amp com 图片 拓扑排序 out
原文地址:https://www.cnblogs.com/caterpillor/p/13604941.html