hdu 1285 确定比赛名次
2012-08-13 10:52
225 查看
题意: 拓扑排序,按字典序输出。
#include<iostream> #include<string.h> #include<algorithm> #include<queue> using namespace std; int n,m , top; int vis[510][510]; int ans[510]; struct E { int v, next; }e[20010]; struct N { int head , dep , rd; }node[610]; void insert(int u,int v) { e[top].v=v; e[top].next = node[u].head; node[v].rd++; node[u].head=top++; } void Top_sort() { int i,j; for(i=1;i<=n;i++) //保证会按字典序输出 { for(j=1;j<=n;j++) { if(node[j].rd==0) break; } if(j>n) return; //每找到入度为0的(出现环,或已遍历完) ans[i]=j; //把找到入度为0的存入ans[] node[j].rd=-1; //保证j点不会被再次找到 for(int k=node[j].head; k!=NULL; k=e[k].next) //输给第j个队的所有队入度-1 //这样也保证了p1 p2一定会是p1排在p2前 { int p= e[k].v; --node[p].rd; } } } int main() { int u,v; while(scanf("%d%d",&n,&m)!=EOF) { top=1; memset(node,0,sizeof(node)); memset(vis,0,sizeof(vis)); for(int i=0;i<m;i++) { scanf("%d%d",&u,&v); if(vis[u][v]==0) insert(u,v); vis[u][v]=1; } Top_sort(); for (int i = 1; i <= n; ++i) { printf("%d%c", ans[i], i == n ? '\n' : ' '); } } return 0; }
相关文章推荐
- HDU 1285 确定比赛名次
- HDU 1285 确定比赛名次
- HDU1285——确定比赛名次
- hdu 1285 确定比赛名次
- hdu 1285 确定比赛名次
- hdu 1285 确定比赛名次
- HDU 1285 确定比赛名次 拓扑排序
- 【hdu - 1285 确定比赛名次】
- 【HDU - 1285 确定比赛名次】 拓扑排序
- HDU 1285 确定比赛名次(拓扑排序)
- HDU_1285 确定比赛名次
- hdu 1285 确定比赛名次
- Hdu 1285 确定比赛名次
- HDU-1285 确定比赛名次(拓扑排序)
- hdu 1285 确定比赛名次 <拓扑排序>
- HDU 1285 确定比赛名次(拓扑排序&amp;&amp;优先队列优化)
- Hdu 1285 确定比赛名次,拓扑排序
- hdu-1285确定比赛名次---拓扑排序
- 【拓扑排序】HDU 1285——确定比赛名次
- HDU 1285--确定比赛名次