标签:get pre scan ret for ems 循环 ++ 编号
题目大意:原题链接
给出N个未编号的质量各不相同的球,以及它们质量轻重的大小关系,给它们从1~N贴标签编号,无重复。问是否存在可行的编号方法,不存在输出-1,如果存在则输出唯一一种方案,此方案是使得编号小的球的重量尽量轻,先是编号为1的重量要最轻,其次比编号2,以此类推......
思路:当解有多组时,编号小的质量尽量小。所以就采用逆拓扑排序,按编号从大到小,找质量最大的。这样,小标签就都留给了质量小的。
#include<cstdio> #include<cstring> #define maxn 210 using namespace std; int n,m,out[maxn],q[maxn]; int i,j,k,graph[maxn][maxn]; bool Toposort(){ for(i=n;i>=1;i--){//按编号从大到小 for(j=n;j>=1;j--){//找质量最大的 if(!out[j]){ q[j]=i; out[j]=-1; break; } }//j中途退出循环,说明无零出度节点,有环 if(j<1) return false; for(k=1;k<=n;k++){ if(graph[k][j]) out[k]--; } } return true; } int main(){ int T,u,v; scanf("%d",&T); while(T--){ scanf("%d%d",&n,&m); memset(graph,0,sizeof(graph)); memset(out,0,sizeof(out)); for(i=0;i<m;i++){ scanf("%d%d",&u,&v); if(!graph[u][v]){ graph[u][v]=true; out[u]++; }//注意重边 } if(Toposort()){ for(i=1;i<=n;i++){ if(i!=n) printf("%d ",q[i]); else printf("%d\n",q[i]); } } else printf("-1\n"); } }
标签:get pre scan ret for ems 循环 ++ 编号
原文地址:http://www.cnblogs.com/freinds/p/6411696.html