您的位置:首页 > 其它

POJ 3275 Ranking The Cows

2010-10-30 15:28 387 查看
对N个数字进行大小排序,最多需要知道N*(N-1)/2对大小关系

这道题让你求最少的对数,是在最大值N*(N-1)/2的基础上求的,因为要确保在知道C对比较后能将序列完全排出来,故M+C=N*(N-1)/2

由于数据量比较大,N最大可以到1000,用邻接矩阵写Floyd回超时,所以写了个邻接表的Floyd,用DFS也可以

代码:

#include<iostream>
using namespace std;
int g1[1001][1001],g2[1001][1001],dis[1001][1001];//g1正向图,g2反向图
int n;
int main()
{
int m,i,j,k,ans,pre,next;
memset(g1,0,sizeof(g1));
memset(g2,0,sizeof(g2));
memset(dis,0,sizeof(dis));
cin>>n>>m;
for(k=1;k<=m;k++)
{
scanf("%d %d",&i,&j);
g1[i][0]++;//计数器
g1[i][g1[i][0]]=j;//i->j
g2[j][0]++;
g2[j][g2[j][0]]=i;//j->i
dis[i][j]=1;
}
for(k=1;k<=n;k++)
{
for(i=1;i<=g2[k][0];i++)
{
pre=g2[k][i];
for(j=1;j<=g1[k][0];j++)
{
next=g1[k][j];
if(dis[pre][next]==0)
{
dis[pre][next]=1;
g1[pre][0]++;
g1[pre][g1[pre][0]]=next;
g2[next][0]++;
g2[next][g2[next][0]]=pre;
}
}
}
}
ans=0;
for(i=1;i<=n;i++)
ans+=g1[i][0];
printf("%d/n",n*(n-1)/2-ans);
return 0;
}/*
#include<iostream>
#include<vector>
using namespace std;
vector<int>vec[1001];//二维容器,相当于一个邻接表
int cnt,visit[1001];
void dfs(int u)
{
int v;
cnt++;
visit[u]=1;
for(vector<int>::size_type ix=0;ix<vec[u].size();ix++)
{
v=vec[u][ix];
if(!visit[v])
dfs(v);
}
}
int main()
{
int i,a,b,m,n;
scanf("%d %d",&n,&m);
for(i=1;i<=m;i++)
{
scanf("%d %d",&a,&b);
vec[a].push_back(b);
}
cnt=0;
for(i=1;i<=n;i++)
{
memset(visit,0,sizeof(visit));
dfs(i);
cnt--;
}
printf("%d/n",n*(n-1)/2-cnt);
return 0;
}*/
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: