题目链接:点我~~
直接逆向拓扑排序就好了,这样能保证每次访问到的都是最大值,再不断更新答案。
#include<iostream> #include<cstdio> #include<cstring> #include<algorithm> #include<queue> using namespace std; typedef long long LL; const int INF = 0x3f3f3f3f; const int mod=1e9+7; const int M =100010; struct node { int u,v; int next; } edge[M*2]; int head[M*2]; int indgree[M]; int tol; void init() { tol=0; memset(head,-1,sizeof(head)); memset(indgree,0,sizeof(indgree)); } void add(int a,int b) { edge[tol].v=b; edge[tol].next=head[a]; head[a]=tol++; } int tuopu(int n) { priority_queue<int >q; bool fl=1; for(int i=n; i>=1; i--) { if(indgree[i]==0) { q.push(i); } } LL ans=0; int tmp=INF; while(!q.empty()) { int u=q.top(); q.pop(); ans+=min(tmp,u); tmp=min(tmp,u); for(int i=head[u]; ~i; i=edge[i].next) { int v=edge[i].v; indgree[v]--; if(indgree[v]==0) { q.push(v); } } } cout<<ans<<endl; } int main() { int t; scanf("%d",&t); int n,m; while(t--) { init(); scanf("%d%d",&n,&m); int a,b; for(int i=0; i<m; ++i) { scanf("%d%d",&a,&b); indgree[b]++; add(a,b); } tuopu(n); } return 0; }
- 版权声明:本文基于《知识共享署名-相同方式共享 3.0 中国大陆许可协议》发布,转载请遵循本协议
- 文章链接:http://www.carlstedt.cn/archives/984 (转载时请注明本文出处及文章链接)
发表评论
快来吐槽一下吧!