D - Ordering Tasks (拓扑排序)

D - Ordering Tasks

题意:给个有向图,进行拓扑排序

 1 /***********************************************/
 2 struct node{
 3     int v;
 4     node(){}
 5     node(int _v):v(_v){}
 6 };
 7 vector<node>G[maxn];//邻接表法 
 8 int in[maxn],out[maxn];//每个顶点入度出度 
 9 int n,m;
10 
11 void Tuop()
12 {
13     for(int i=1;i<=n;i++)
14         if(in[i]==0)
15         {
16             for(int j=0;j<G[i].size();j++)
17             {
18                 in[G[i][j].v]--;
19             }
20             cout<<i<<" ";
21             in[i]=-1;
22             Tuop();
23             break;
24         }
25 }
26 
27 int main()
28 {
29 
30     while(1)
31     {
32         sc2(n,m);
33         if(n==0 && m==0) return 0;
34         mem0(G);
35         mem0(in);
36         mem0(out);
37         for(int i=1;i<=m;i++){
38             int a,b;
39             sc2(a,b);
40             G[a].push_back(node(b));
41             in[b]++;
42             out[a]++;
43         }
44         
45         Tuop();
46         cout<<endl;
47     }
48     return 0;
49 }
50 
51 
52 /*
53 5 4
54 1 2
55 2 3
56 1 3
57 1 5
58 0 0
59 */
View Code

E - 确定比赛名次

一样的有向图拓扑排序,答案用vector存一下,保证空格

 1 /***********************************************/
 2 struct node{
 3     int v;
 4     node(){}
 5     node(int _v):v(_v){}
 6 };
 7 vector<int>ans;//存拓扑排序结果 
 8 vector<node>G[maxn];//邻接表法 
 9 int in[maxn],out[maxn];//每个顶点入度出度 
10 int n,m;
11 
12 void Tuop()
13 {
14     for(int i=1;i<=n;i++)
15         if(in[i]==0)
16         {
17             for(int j=0;j<G[i].size();j++)
18             {
19                 in[G[i][j].v]--;
20             }
21             ans.p_b(i);
22             in[i]=-1;
23             Tuop();
24             break;
25         }
26 }
27 
28 int main()
29 {
30     while(sc2(n,m)!=EOF)
31     {
32         ans.clear();
33         
34         if(n==0 && m==0) return 0;
35         mem0(G);
36         mem0(in);
37         mem0(out);
38         for(int i=1;i<=m;i++){
39             int a,b;
40             sc2(a,b);
41             G[a].push_back(node(b));
42             in[b]++;
43             out[a]++;
44         }
45         Tuop();
46         cout<<ans[0];
47         for(int i=1;i<ans.size();i++)
48             cout<<" "<<ans[i];
49         cout<<endl;
50     }
51     return 0;
52 }
53 
54 
55 /*
56 5 4
57 1 2
58 2 3
59 1 3
60 1 5
61 0 0
62 */
View Code

猜你喜欢

转载自www.cnblogs.com/liuyongliu/p/10319808.html