hdu5695 貪心+拓撲排序
阿新 • • 發佈:2019-01-04
#include <iostream> #include <algorithm> #include <cstring> #include <cstdio> #include <queue> #define M 100010 using namespace std; int in[M]; vector<int>v[M]; //出度 priority_queue<int>q; int main() { int t; long i,k,n,m,a,b; __int64 ans; cin>>t; while(t--) { cin>>n>>m; for(i=1;i<=n;i++) { v[i].clear();// 清空 } memset(in,0,sizeof(in)); while(m--) { scanf("%ld%ld",&a,&b); in[b]++; v[a].push_back(b); } for(i=1;i<=n;i++) { if(in[i]==0) q.push(i); } ans=0; long Min=n; //包括自己在內的前方所有同學的最小ID while(!q.empty()) { k=q.top(); //包括自己在內的前方所有同學的最小ID ->貪心 大的排前面 每次在入度為0中挑一個最大的出列 q.pop(); for(i=0;i<v[k].size();i++) { in[v[k][i]]--; if(in[v[k][i]]==0) { q.push(v[k][i]); } } Min=min(Min,k); ans+=Min; } printf("%I64d\n",ans); } return 0; }