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 }

 

posted on 2017-07-02 16:36  hhhhx  阅读(135)  评论(0编辑  收藏  举报

导航