首页 > 代码库 > poj3687 拓扑排序 还没怎么搞明白 回头再想想

poj3687 拓扑排序 还没怎么搞明白 回头再想想

【题意】:n个重量为1~n的球,给定一些球之间的重量比较关系(如 2 1  表示第二个球比第一个球轻),求每个球可能的重量,ans[i] 表示第i个球的重量,要求输出的是ans字典序最小的情况。

【思路】:对于给出的a b  建反边,每次 在出度为0的所有点里选一个序号最小的赋值(从n开始 由大到小赋)。

 1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<string> 5 #include<algorithm> 6 #include<map> 7 #include<queue> 8 #include<stack> 9 #include<set>10 #include<cmath>11 #include<vector>12 #define inf 0x3f3f3f3f13 #define Inf 0x3FFFFFFFFFFFFFFFLL14 #define eps 1e-915 #define pi acos(-1.0)16 using namespace std;17 18 int in[202],ans[202];19 bool g[202][202],vis[202];20 priority_queue<int>q;21 22 int main()23 {24     int i,t,j,n,m,a,b;25     scanf("%d",&t);26     while(t--)27     {28        //getchar();29         scanf("%d%d",&n,&m);30         memset(in,0,sizeof(in));31         memset(g,false,sizeof(g));32         memset(vis,false,sizeof(vis));33         while(m--)34         {35             scanf("%d%d",&a,&b);36             if(g[b][a])37                 continue;38             g[b][a]=true;39             in[a]++;40         }41         for(i=1;i<=n;i++)42             if(in[i]==0)43                 {44                     q.push(i);45                     vis[i]=true;46                 }47         int num=n;48         for(i=0;i<n;i++)//每次一个出度为0的序号最小的 49         {50             int temp;51             if(q.empty())52                 break;53             temp=q.top();q.pop(); //printf("i  %d \n",temp);54             ans[temp]=num--;55             for(int j=1;j<=n;j++)56                 if(j!=temp&&g[temp][j])57                 {58                     in[j]--;59                     if(in[j]==0&&!vis[j])60                        {61                            q.push(j);62                            vis[j]=true;63                        }64                 }66         }67         //printf("ans    ");68         if(i<n)69             printf("-1\n");70         else71         {72             printf("%d",ans[1]);73             for(i=2;i<=n;i++)74                 printf(" %d",ans[i]);75             printf("\n");76         }77     }78 79 }

 

考虑这组数据:

25 41 44 25 33 25 31 44 23 5输出应该是:1 5 3 4 21 3 4 2 5