首页 > 代码库 > PKU 3687
PKU 3687
题目大意:原题链接
给出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"); } }
PKU 3687
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。