hdu 5695
思路:拓扑排序,标号越大的在前面,可用优先队列
1 #include<bits/stdc++.h> 2 using namespace std; 3 typedef long long ll; 4 const int N=1e5+10; 5 6 struct node{ 7 int to,next; 8 }e[N]; 9 int head[N],tot; 10 int ru[N]; 11 int a[N]; 12 priority_queue<int >s; 13 14 void init(){ 15 memset(head,-1,sizeof(head)); 16 memset(ru,0,sizeof(ru)); 17 tot=0; 18 } 19 void add(int u,int v){ 20 e[tot].to=v;e[tot].next=head[u];head[u]=tot++; 21 } 22 ll sum; 23 void dfs(int u){ 24 for(int i=head[u];i!=-1;i=e[i].next){ 25 int v=e[i].to; 26 ru[v]--; 27 if(ru[v]==0){ 28 s.push(v); 29 } 30 } 31 } 32 int main(){ 33 int t; 34 scanf("%d",&t); 35 while(t--){ 36 int n,m; 37 int x,y; 38 init(); 39 scanf("%d%d",&n,&m); 40 for(int i=1;i<=n;i++) a[i]=i; 41 for(int i=1;i<=m;i++){ 42 scanf("%d%d",&x,&y); 43 add(x,y);ru[y]++; 44 } 45 sum=0; 46 for(int i=1;i<=n;i++) if(!ru[i]) {s.push(i);} 47 int k=1e7; 48 while(!s.empty()){ 49 x=s.top();s.pop(); 50 // cout<<sum<<" "<<x<<endl; 51 k=min(k,x); 52 sum+=k; 53 dfs(x); 54 } 55 cout<<sum<<endl; 56 } 57 }