Hdu oj 1285 确定赛事名次
Hdu oj 1285 确定比赛名次
题目:点击打开链接
分析:简单拓扑排序,数据少的情况下可以用二维数组,数据比较多的时候用邻接表或优先队列。代码一:二维数组 代码二:邻接表 代码三:如何构建邻接表代码四:优先队列。
代码一:
#include<stdio.h> #include<string.h> int queue[510],indegree[510]; int map[510][510]; int n,m; void tuopo() { int i; int j,k,t=0; for(j=0;j<n;j++) { for(i=1;i<=n;i++) { if(indegree[i]==0) { k=i; indegree[i]=-1; break; } } queue[t++]=k; for(i=1;i<=n;i++) { if(map[k][i]) indegree[i]--; } } printf("%d",queue[0]); for(i=1;i<n;i++) printf(" %d",queue[i]); printf("\n"); } int main() { while(~scanf("%d%d",&n,&m)) { int j; int a,b; memset(queue,0,sizeof(queue)); memset(indegree,0,sizeof(indegree)); memset(map,0,sizeof(map)); for(j=1;j<=m;j++) { scanf("%d%d",&a,&b); if(map[a][b]==0) { map[a][b]=1; indegree[b]++; } } tuopo(); } return 0; }
代码二:
#include<stdio.h> #include<string.h> int n,m; int indegree[51000],queue[51000]; struct stu { int to; int next; }a1[51000]; int head[51000]; void topo() { int top,t=0; for(int i=0;i<n;i++) { for(int j=1;j<=n;j++) { if(indegree[j]==0) { top=j; indegree[j]=-1; break; } } queue[t++]=top; for(top=head[top];top!=-1;top=a1[top].next) { indegree[a1[top].to]--; } } printf("%d",queue[0]); for(int i=1;i<n;i++) printf(" %d",queue[i]); printf("\n"); } int main() { while(~scanf("%d%d",&n,&m)) { int i; int a,b; memset(indegree,0,sizeof(indegree)); memset(head,-1,sizeof(head)); for(i=1;i<=m;i++) { scanf("%d%d",&a,&b); a1[i].to=b; a1[i].next=head[a]; head[a]=i; indegree[b]++; } topo(); } return 0; }
代码三:
#include<stdio.h> #include<string.h> int head[100100],cnt;//head表头 struct s { int u,v,w; int next;//后继 }edge[100010]; void add(int u,int v,int w) { edge[cnt].u=u; edge[cnt].v=v; edge[cnt].w=w; edge[cnt].next=head[u]; head[u]=cnt++; } int main() { int n; while(scanf("%d",&n)!=EOF) { int i; cnt=0; memset(head,-1,sizeof(head)); for(i=0;i<n;i++) { int u,v,w; scanf("%d%d%d",&u,&v,&w);// add(u,v,w); } int u; scanf("%d",&u);//查找u节点的邻接点 for(i=head[u];i!=-1;i=edge[i].next) { int v=edge[i].v; int w=edge[i].w; printf("%d%d",v,w); } } return 0; }
代码四:
#include<cstdio> #include<cstdlib> #include<cstring> #include<queue> #include<functional> using namespace std; int map[510][510]; int indegree[510]; void topo(int n) { priority_queue<int,vector<int>,greater<int> >Q; int i,j,m,t=0; for(i=1;i<=n;++i){ if(indegree[i]==0){ Q.push(i); } } int sign=1; while(!Q.empty()){ int top=Q.top();Q.pop(); indegree[top]=-1; if(sign) printf("%d",top); else printf(" %d",top); sign=0; for(i=1;i<=n;++i){ if(map[top][i]){ indegree[i]--; if(indegree[i]==0){ Q.push(i); } } } } printf("\n"); } int main() { int n,m,i,j,a,b; while(scanf("%d%d",&n,&m)!=EOF){ memset(indegree,0,sizeof(indegree)); memset(map,0,sizeof(map)); for(i=0;i<m;++i){ scanf("%d%d",&a,&b); if(map[a][b]==0){ map[a][b]=1;indegree[b]++; } } topo(n); } return 0; }
版权声明:本文为博主原创文章,未经博主允许不得转载。