确定比赛名次(map+邻接表 邻接表 拓扑结构 队列+邻接表)
2015-08-14 11:55
381 查看
确定比赛名次
Time Limit : 2000/1000ms (Java/Other) Memory Limit : 65536/32768K (Java/Other)Total Submission(s) : 40 Accepted Submission(s) : 31
[align=left]Problem Description[/align]
有N个比赛队(1<=N<=500),编号依次为1,2,3,。。。。,N进行比赛,比赛结束后,裁判委员会要将所有参赛队伍从前往后依次排名,但现在裁判委员会不能直接获得每个队的比赛成绩,只知道每场比赛的结果,即P1赢P2,用P1,P2表示,排名时P1在P2之前。现在请你编程序确定排名。
[align=left]Input[/align]
输入有若干组,每组中的第一行为二个数N(1<=N<=500),M;其中N表示队伍的个数,M表示接着有M行的输入数据。接下来的M行数据中,每行也有两个整数P1,P2表示即P1队赢了P2队。
[align=left]Output[/align]
给出一个符合要求的排名。输出时队伍号之间有空格,最后一名后面没有空格。 其他说明:符合条件的排名可能不是唯一的,此时要求输出时编号小的队伍在前;输入数据保证是正确的,即输入数据确保一定能有一个符合要求的排名。
[align=left]Sample Input[/align]
4 3 1 2 2 3 4 3
[align=left]Sample Output[/align]
1 2 4 3
题解:拓扑结构,可以用N种方法;
代码一:拓扑结构模板
#include<stdio.h> #include<string.h> const int MAXN=510; int N,M; int map[MAXN][MAXN]; int que[MAXN],ans[MAXN]; void topu(){int k,top=0,temp; for(int i=0;i<N;i++){ temp=-1; for(int j=1;j<=N;j++){ if(!que[j]){ ans[top++]=j; que[j]=-1; k=j; temp=0; break; } } if(temp==-1)break; for(int j=1;j<=N;j++){ if(map[k][j])que[j]--; } } for(int i=0;i<top;i++){ if(i)printf(" "); printf("%d",ans[i]); } puts(""); } void initial(){ memset(map,0,sizeof(map)); memset(que,0,sizeof(que)); } int main(){ int a,b; while(~scanf("%d%d",&N,&M)){ initial(); while(M--){ scanf("%d%d",&a,&b); if(!map[a][b]){ map[a][b]=1; que[b]++; } } topu(); } return 0; }
代码二:邻接表:
#include<stdio.h> #include<string.h> const int MAXN=510; struct Node{ int next,to; }; Node edg[MAXN]; int head[MAXN]; int que[MAXN],ans[MAXN],top; int N,M; void topu(){int k; for(int i=0;i<N;i++){ int temp=-1; for(int j=1;j<=N;j++){ if(!que[j]){ temp=0; k=j; que[j]=-1; ans[top++]=j; break; } } if(temp==-1)break; for(int j=head[k];j!=-1;j=edg[j].next){ que[edg[j].to]--; } } for(int i=0;i<top;i++){ if(i)printf(" "); printf("%d",ans[i]); } puts(""); } void initial(){ memset(head,-1,sizeof(head)); memset(que,0,sizeof(que)); top=0; } int main(){int a,b; while(~scanf("%d%d",&N,&M)){ initial(); for(int i=1;i<=M;i++){ scanf("%d%d",&a,&b); edg[i].to=b; edg[i].next=head[a]; head[a]=i; que[b]++; } topu(); } return 0; }
代码三:map+邻接表;
#include<stdio.h> #include<string.h> #include<map> using namespace std; const int MAXN=510; struct Node{ int to,next; }; int head[MAXN]; Node edg[MAXN]; int ans[MAXN],top; int N,M; map<int,int>mp; void topu(){map<int,int>::iterator iter; //for(iter=mp.begin();iter!=mp.end();iter++){ // printf("%d %d\n",iter->first,iter->second); // } for(int i=0;i<N;i++){ for(iter=mp.begin();iter!=mp.end();iter++){ if(!iter->second)break; } if(iter==mp.end())break; mp.erase(iter); ans[top++]=iter->first; for(int j=head[iter->first];j!=-1;j=edg[j].next){ mp[edg[j].to]--; } } for(int i=0;i<top;i++){ if(i)printf(" "); printf("%d",ans[i]); } puts(""); } void initial(){ memset(head,-1,sizeof(head)); top=0; mp.clear(); for(int i=N;i>0;i--)mp[i]=0; } int main(){int a,b; while(~scanf("%d%d",&N,&M)){ initial(); for(int i=0;i<M;i++){ scanf("%d%d",&a,&b); edg[i].to=b; edg[i].next=head[a]; head[a]=i; mp[b]++; } topu(); } return 0;
代码四:队列+邻接表;
#include<stdio.h> #include<string.h> #include<queue> using namespace std; const int MAXN=510; struct Node{ int to,next; }; int head[MAXN],que[MAXN]; Node edg[MAXN]; int ans[MAXN],top; int N,M; priority_queue<int,vector<int>,greater<int> >dl; void topu(){ for(int j=1;j<=N;j++){ if(!que[j])dl.push(j); } while(!dl.empty()){ ans[top++]=dl.top(); int k=dl.top(); que[k]=-1; dl.pop(); for(int j=head[k];j!=-1;j=edg[j].next){ que[edg[j].to]--; if(!que[edg[j].to])dl.push(edg[j].to); } } for(int i=0;i<top;i++){ if(i)printf(" "); printf("%d",ans[i]); } puts(""); } void initial(){ memset(head,-1,sizeof(head)); top=0; memset(que,0,sizeof(que)); while(!dl.empty())dl.pop(); } int main(){int a,b; while(~scanf("%d%d",&N,&M)){ initial(); for(int i=0;i<M;i++){ scanf("%d%d",&a,&b); edg[i].to=b; edg[i].next=head[a]; head[a]=i; que[b]++; } topu(); } return 0; }
今天比赛这个题错了好多次。。。。
知道真相的我眼泪流了下来。。。
我没有判断重边。。。
代码:
#include<iostream> #include<cstdio> #include<cstring> #include<cmath> #include<algorithm> #include<queue> #include<vector> using namespace std; const int INF=0x3f3f3f3f; #define mem(x,y) memset(x,y,sizeof(x)) #define SI(x) scanf("%d",&x); const int MAXN=510; int que[MAXN],mp[MAXN][MAXN]; int ans[MAXN]; int N; priority_queue<int,vector<int>,greater<int> >dl; /*void topu(){ int a,k=0; while(!dl.empty())dl.pop(); for(int i=1;i<=N;i++) if(!que[i]){ dl.push(i); que[i]=-1; } while(!dl.empty()){ a=dl.top(); dl.pop(); que[a]=-1; ans[k++]=a; for(int i=1;i<=N;i++) if(mp[a][i]){ que[i]--; if(!que[i]) dl.push(i); } } for(int i=0;i<k;i++){ if(i)printf(" "); printf("%d",ans[i]); }puts(""); }*/ void topu(){ int k=0; for(int i=0;i<N;i++){ int a; for(int j=1;j<=N;j++){ if(!que[j]){ a=j;break; } } ans[k++]=a; que[a]=-1; for(int j=1;j<=N;j++){ if(mp[a][j])que[j]--; } } for(int i=0;i<k;i++){ if(i)printf(" "); printf("%d",ans[i]); }puts(""); } int main(){ int M,a,b; while(~scanf("%d%d",&N,&M)){ mem(que,0);mem(mp,0); for(int i=0;i<M;i++){ scanf("%d%d",&a,&b); if(!mp[a][b]){//****** mp[a][b]=1; que[b]++; } } topu(); } return 0; }
相关文章推荐
- Cinder meeting 2015-08-22
- 字节数组byte[]和整型,浮点型数据的转换——Java代码
- request对象的几个常用方法
- 说说第三方支付接口开发及开发中遇到的坑爹问题
- hdu 2671 shǎ崽 OrOrOrOrz(排序)
- Android(java)学习笔记153:layout_weight使用注意事项
- Win7安vc2008编译报LINK : fatal error LNK1000: Internal error during IncrBuildImage
- flex复杂表头动态生成
- JavaScript变量的作用域全解析
- DIV+CSS的文字居中问题
- sql 之 limit 用法
- JAVA wait(), notify(),sleep详解
- android语音识别技术
- table 添加竖直线
- mysql数据类型选择
- EEPlat的图表功能
- 静态链接的一点小总结(二) 《程序员的自我修养》·笔记
- iOS开发前须注意
- 零基础学python-2.19 定义函数、调用函数与默认参数
- Quartz2d总结