HDU - 1704 Rank (floyd传递闭包)
https://vjudge.net/problem/HDU-1704
分析
刚开始居然想用并查集来做😳
对于
2 1
3 1
这个实例,2和3是没关系的,但是用并查集反而有了关系
因此不能双向存图,g[i][j]=1表示i胜j ,g[j][i]=0 表示j输给i
AC代码
#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;
const int N=510;
int n,m;
int g[N][N];
void floyd()
{
for(int k=1;k<=n;k++)
for(int i=1;i<=n;i++)
{
if(g[i][k])
{
for(int j=1;j<=n;j++)
{
if(g[k][j])
{
g[i][j]=1;
}
}
}
}
}
int main()
{
int t;
cin>>t;
while(t--)
{
cin>>n>>m;
memset(g,0,sizeof g);
int a,b;
while(m--)
{
cin>>a>>b;
g[a][b]=1;
}
floyd();
int ans=0;
for(int i=1;i<=n;i++)
{
for(int j=i+1;j<=n;j++)
if(g[i][j]==0 && g[j][i]==0)
ans++;
}
cout<<ans<<endl;
}
return 0;
}
错误代码
#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;
const int N=510;
int n,m;
int g[N][N];
void floyd()
{
for(int k=1;k<=n;k++)
for(int i=1;i<=n;i++)
{
if(g[i][k])
{
for(int j=1;j<=n;j++)
{
if(g[k][j])
{
g[i][j]=1;
}
}
}
}
}
int main()
{
int t;
cin>>t;
while(t--)
{
cin>>n>>m;
memset(g,0,sizeof g);
int a,b;
while(m--)
{
cin>>a>>b;
g[a][b]=1;
}
floyd();
int ans=0;
for(int i=1;i<=n;i++)
{
for(int j=i+1;j<=n;j++)
if(g[i][j]==0 && g[j][i]==0)
ans++;
}
cout<<ans<<endl;
}
return 0;
}
本文来自博客园,作者:斯文~,转载请注明原文链接:https://www.cnblogs.com/zhiweb/p/15483308.html

浙公网安备 33010602011771号