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;
 } 
posted @ 2021-07-25 18:41  斯文~  阅读(22)  评论(0)    收藏  举报

你好!