hdu1285
注意题目说排名可能不是唯一的,此时要求先输出时编号小的队伍。
\\hdu1285
#include<bits/stdc++.h>
using namespace std;
int a[505][505];
int in[505];
int n,m;
int main()
{
while(cin>>n>>m)
{
memset(a,0,sizeof(a));
memset(in,0,sizeof(in));
while(m--)
{
int x,y;cin>>x>>y;
if(a[x][y]==0)in[y]++;
a[x][y]=1;
}
queue<int>x;
int show=0;
for(int i=1;i<=n;i++)
{
if(in[i]==0)
{
x.push(i);
in[i]=-1;
break;
}
}
while(x.size())
{
int y=x.front();x.pop();
if(show)cout<<' ';
else show++;
cout<<y;
for(int i=1;i<=n;i++)
{
if(a[y][i])
{
in[i]--;
a[y][i]=0;
}
}
for(int i=1;i<=n;i++)
{
if(in[i]==0)
{
x.push(i);
in[i]=-1;
break;
}
}
}cout<<endl;
}
}
hdu 3342
判断所给关系有没有环
//hdu3342
#include <bits/stdc++.h>
using namespace std;
int a[105][105];
int in[105];
int show[105];
queue<int>x;
int main()
{
int n,m;
while(true)
{
while(!x.empty()) x.pop();
scanf("%d%d",&n,&m);
if(n==0&&m==0)
break;
memset(a,0,sizeof(a));
memset(in,0,sizeof(in));
memset(show,0,sizeof(show));
while(m--)
{
int x,y;
scanf("%d%d",&x,&y);
if(a[x][y]) continue;
a[x][y]=1;
in[y]++;
}
int t=0;
for(int i=0;i<n;i++)
{
if(in[i]==0)
{
x.push(i);
show[i]=1;
t++;
}
}
while(!x.empty())
{
int u=x.front();
x.pop();
for(int i=0;i<n;++i){
if(a[u][i]&&show[i]==0){
in[i]--;
if(in[i]==0){
show[i]=1;
t++;
x.push(i);
}
}
}
}
cout<<(t==n?"YES":"NO")<<endl;
}
}
hdu2647
反向建图,邻接矩阵会超内存。
//hdu2647
#include <bits/stdc++.h>
using namespace std;
queue<int>x;
int show[10005];
int in[10005];
int n,m;
vector<int>g[10005];
int main()
{
while(cin>>n>>m)
{
while(x.size())
x.pop();
for(int i=1;i<=n;++i) g[i].clear();
memset(show,0,sizeof(show));
memset(in,0,sizeof(in));
int sum=888;
while(m--)
{
int t1,t2;
cin>>t2>>t1;
g[t1].push_back(t2);
in[t2]++;
}
for(int i=1;i<=n;i++)
{
if(in[i]==0)
{
x.push(i);
show[i]=sum;
}
}
sum++;
int t=0;
while(x.size())
{
int y=x.front();
x.pop();
t++;
for(int i=0;i<g[y].size();i++){
int v=g[y][i];
in[v]--;
if(in[v]==0){
x.push(v);
show[v]=max(show[v],show[y]+1);
}
}
}
if(t<n)
cout<<-1<<endl;
else
{
int s=0;
for(int i=1;i<=n;i++)
s=s+show[i];
cout<<s<<endl;
}
//cout<<"----"<<endl;
}
}