杭电ACM 1285 确定比赛名次(拓扑排序)
2012-08-06 23:53
225 查看
http://acm.hdu.edu.cn/showproblem.php?pid=1285
这里用到了网上找的的拓扑排序的模版。
map[i][j]存放有向图的起点i和终点j之间是否连线,=1连线,=0为空。
结果的顺序存放在res数组里面。
d[i]表示第i个元素的入度,
1)入度为零即表示可以读;
2)有多个入度为零的点则最终顺序不唯一;
3)不存在入度为零的点则顺序不能确定。
这道题不用考虑有环的情况。
这里用到了网上找的的拓扑排序的模版。
map[i][j]存放有向图的起点i和终点j之间是否连线,=1连线,=0为空。
结果的顺序存放在res数组里面。
d[i]表示第i个元素的入度,
1)入度为零即表示可以读;
2)有多个入度为零的点则最终顺序不唯一;
3)不存在入度为零的点则顺序不能确定。
这道题不用考虑有环的情况。
#include <iostream> using namespace std; #define MAX 510 int map[MAX][MAX]; //图 int res[MAX]; // 存放结果 int TopSort(int n,int mat[MAX][MAX],int* res) { int d[MAX],i,j,k; for (i=0;i<n;i++) for (d[i]=j=0;j<n;d[i]+=mat[j++][i]); for (k=0;k<n;res[k++]=i) { for (i=0;d[i]&&i<n;i++); if (i==n) return 0; for (d[i]=-1,j=0;j<n;j++) d[j]-=mat[i][j]; } return 1; } int main(){ int N,M; int a,b; while(cin>>N>>M){ if(N==0&&M==0) break; memset(map,0,sizeof(map)); for(int i=0;i<M;i++){ cin>>a>>b; map[a-1][b-1]=1; } TopSort(N,map,res); for(int i=0;i<N;i++){ cout<<res[i]+1; if(i!=N-1) cout<<" "; } cout<<endl; } }
相关文章推荐
- 杭电 1285 确定比赛名次(拓扑排序)
- [ACM] hdu 1285 确定比赛名次 (拓扑排序)
- 杭电1285 确定比赛名次(拓扑排序)
- [ACM] hdu 1285 确定比赛名次 (拓扑排序)
- 杭电 1285 确定比赛名次(拓扑排序)
- 拓扑排序杭电 1285确定比赛名次
- 杭电 1285 确定比赛名次 【拓扑排序】
- 杭电 1285 确定比赛名次(拓扑排序)
- HDU 1285 确定比赛名次——拓扑排序
- HDU 1285 确定比赛名次【拓扑排序】
- HDOJ--1285 确定比赛名次(拓扑排序)
- 杭电1285确定比赛名次
- HDU 1285 确定比赛名次(拓扑排序)
- 拓扑排序 详解 hd 1285 确定比赛名次 31ms
- HDOJ题目1285确定比赛名次(拓扑排序,模板)
- HDU 1285 确定比赛名次 (拓扑排序)
- hdu 1285 确定比赛名次 (简单的拓扑排序)
- HDU 1285-确定比赛名次(拓扑排序)
- HD-1285-确定比赛名次(拓扑排序模板题)
- HDU 1285 确定比赛名次(拓扑排序)