zoukankan      html  css  js  c++  java
  • 1770. The Party of Ural Champions 夜

    http://acm.timus.ru/problem.aspx?space=1&num=1770

    假设有可行解

    根据所给最短路的情况进行分类 枚举两点最短路

    假设最短路是dist(i,j) 相连情况为 k(i,j)(-1表示没有直接相连,0表示相连了值为0,1表示相连了值为1)

    1, dist(i,j)>1||dist(j,i)>1 --> k(i,j)==k(j,i)==-1.

    2, dist(i,j)==1&&dist(j,i)==1  -->k(i,j)==k(j,i)==-1.

    3, dist(i,j)==0&&dist(j,i)==0  -->k(i,j) k(j,i) 可以都等于0

    4, dist(i,j)==1&&dist(j,i)==0  -->k(i,j) 可以等于1,  k(j,i) 可以等于0.

    4, dist(i,j)==0&&dist(j,i)==1  -->k(i,j) 可以等于0,k(j,i)可以等于1.

    然后根据 k() 的情况 进行 floyd 看是否可以得到 dist()

    代码:

    #include<iostream>
    #include<cstdio>
    #include<cstring>
    #include<string>
    #include<map>
    #include<vector>
    #include<stack>
    #include<set>
    #include<map>
    #include<queue>
    #include<deque>
    #include<algorithm>
    #include<cmath>
    #define LL long long
    //#pragma comment(linker, "/STACK:1024000000,1024000000")
    using namespace std;
    const double PI=acos(-1.0);
    const int N=305;
    int a[N][N],b[N][N];
    int ans[N][N];
    int main()
    {
        //freopen("data.in","r",stdin);
        int n;
        cin>>n;
        for(int i=1;i<=n;++i)
        for(int j=1;j<=n;++j)
        cin>>a[i][j];
        for(int i=1;i<=n;++i)
        {
            ans[i][i]=-1;
            for(int j=i+1;j<=n;++j)
            {
                if(a[i][j]>1||a[j][i]>1)
                ans[i][j]=ans[j][i]=-1;
                else if(a[i][j]==1&&a[j][i]==1)
                ans[i][j]=ans[j][i]=-1;
                else if(a[i][j]==0&&a[j][i]==0)
                ans[i][j]=ans[j][i]=0;
                else if(a[i][j]==0&&a[j][i]==1)
                {ans[i][j]=0;ans[j][i]=1;}
                else if(a[i][j]==1&&a[j][i]==0)
                {ans[i][j]=1;ans[j][i]=0;}
            }
        }
        for(int i=1;i<=n;++i)
        for(int j=1;j<=n;++j)
        if(i==j)
        b[i][j]=0;
        else
        b[i][j]=ans[i][j];
        for(int l=1;l<=n;++l)
        for(int i=1;i<=n;++i)
        for(int j=1;j<=n;++j)
        if(b[i][l]!=-1&&b[l][j]!=-1&&(b[i][j]==-1||b[i][j]>b[i][l]+b[l][j]))
        b[i][j]=b[i][l]+b[l][j];
        bool blag=true;
        for(int i=1;i<=n;++i)
        for(int j=1;j<=n;++j)
        if(a[i][j]!=b[i][j])
        blag=false;
        if(!blag)
        cout<<"NO"<<endl;
        else
        {
            cout<<"YES"<<endl;
            for(int i=1;i<=n;++i)
            {
                for(int j=1;j<=n;++j)
                cout<<(ans[i][j]+1);
                cout<<endl;
            }
        }
        return 0;
    }
    

      

  • 相关阅读:
    tcp/ip--百度百科
    Web service--百度百科
    .NET--百度百科
    ibatis--百度百科
    Struts2--百度百科
    spring--百度百科
    从头认识Spring-1.15 对SpEl的值的操作(1)-数值运算
    performSelector 方法的自己主动俘获特性
    图解WinHex使用入门
    LINQ使用与并行
  • 原文地址:https://www.cnblogs.com/liulangye/p/2933787.html
Copyright © 2011-2022 走看看