hdu-1704-Rank(floyd-传递闭包)

来源:互联网 发布:辐射测试软件 编辑:程序博客网 时间:2024/05/06 15:27

题意:

A战胜B ,B战胜C,则A可以战胜C,询问有多少种情况给出u,v 不能得知战斗结果

思路:

传递闭包。判关系。

#include<cstdio>#include<cstdlib>#include<cstring>#include<cmath>#include <vector>#include<algorithm>using namespace std;const int maxn=1505;int n,m;int g[maxn][maxn]; int vis[maxn];void floyd(){    for(int k=1; k<=n; k++)        for(int i=1; i<=n; i++)            if(g[i][k]==1||g[i][k]==-1)                for(int j=1; j<=n; j++)                    if(g[i][j]==0)                        if(g[i][k]==1&&g[k][j]==1)                            g[i][j]=1;                        else if(g[i][k]==-1&&g[k][j]==-1)                            g[i][j]=-1;}int main(){    int t;    while(~scanf("%d",&t))    {        while(t--)        {            scanf("%d%d",&n,&m);            memset(pre,-1,sizeof(pre));            memset(g,0,sizeof(g));            int u,v,ans=0;            for(int i=1; i<=m; i++)            {                scanf("%d%d",&u,&v);                g[u][v]=1;                g[v][u]=-1;            }            floyd();            for(int i=1; i<=n; i++)            {                for(int j=1; j<=n; j++)                    if(i!=j&&g[i][j]==0)ans++;            }            printf("%d\n",ans/2);        }        return 0;    }}


0 0
原创粉丝点击