题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1285
题目大意:某人知道N个队伍M场比赛的胜负结果,要求输出N个队伍的名次(id为第二关键字)。
核心思想:转化为图论问题,进行拓扑排序。步骤1.选定入度为0的点 2.删除该点与关联边 3.重复该过程
代码如下:
//拓扑排序 (1.选入度为0的点。2.删除该点及关联边 3.重复该过程)
#include <iostream>
#include <memory.h>
using namespace std;
int MAP[510][510];//MAP[0][i]为第i个点的入度
int M,N;
void clear(int n){ //删除关联边
for(int i=1;i<=N;i++){
if(MAP[n][i]==1){
MAP[n][i]=0;
MAP[0][i]--;
}
}
return;
}
void solve(){
int target;
int cnt=0;
bool flag=false;
for(int i=1;i<=N;i++){
if(MAP[0][i]==0){
cnt++;
cout<<i;
clear(i);
MAP[0][i]--;
i=0;//很关键,
if(cnt==N)cout<<endl;
else cout<<" ";
}
}
return ;
}
int main(){
int x,y,cnt=0;
while(cin>>N>>M){
memset(MAP,0,sizeof(MAP));
while(M--){
cin>>x>>y;
if(!MAP[x][y]){
MAP[x][y]=1;
MAP[0][y]++;
}
}
for(int i=1;i<=N;i++){
if(MAP[0][i]==0)cnt++;
}
if(cnt==0)MAP[0][1]=0;//如果是环要这样处理,1为起点
solve();
}
return 0;
}