zoukankan      html  css  js  c++  java
  • NOIP2012pj文化之旅[floyd]

    描述

    有一位使者要游历各国,他每到一个国家,都能学到一种文化,但他不愿意学习任何一种文化超过一次,即如果他学习了某种文化,则他就不能到达其他有这种文化的国家。不同的国家可能有相同的文化。不同文化的国家对其他文化的看法不同,有些文化会排斥外来文化,即如果他学习了某种文化,则他不能到达排斥这种文化的其他国家。 现给定各个国家间的地理关系,各个国家的文化,每种文化对其他文化的看法,以及这位使者游历的起点和终点(在起点和终点也会学习当地的文化),国家间的道路距离,试求从起点到终点最少需走多少路。

    格式

    输入格式

    第一行为五个整数N,K,M,S,T,每两个整数之间用一个空格隔开,依次代表国家个数(国家编号为1到N),文化种数(文化编号为1到K),道路的条数,以及起点和终点的编号(保证S不等于T)�� 第二行为N个整数,每两个整数之间用一个空格隔开,其中第i个数Ci,表示国家i的文化为Ci。 接下来的K行,每行K个整数,每两个整数之间用一个空格隔开,记第i行的第j个数为aij,aij= 1表示文化i排斥外来文化j,i等于j时表示排斥相同文化的外来人,aij= 0表示不排斥,注意i排斥j并不保证j一定也排斥i。 接下来的M行,每行三个整数u,v,d,每两个整数之间用一个空格隔开,表示国家u与国家v有一条距离为d的可双向通行的道路,保证u不等于v,两个国家之间可能有多条道路。

    输出格式

    输出只有一行,一个整数,表示使者从起点国家到达终点国家最少需要走的距离数,如果无解则输出-1。

    样例1

    样例输入1[复制]

     
    2 2 1 1 2
    1 2
    0 1
    1 0
    1 2 10

    样例输出1[复制]

     
    -1

    样例2

    样例输入2[复制]

     
    2 2 1 1 2
    1 2
    0 1
    0 0
    1 2 10

    样例输出2[复制]

     
    10

    限制

    1S

    提示

    对于20%的数据 有2≤N≤8,K≤5
    对于30%的数据 有2≤N≤10,K≤5
    对于50%的数据 有2≤N≤20,K≤8
    对于70%的数据 有2≤N≤100,K≤10
    对于100%的数据 有2≤N≤100,1≤K≤100,1≤M≤N^2,1≤ki≤K,1≤u,v≤N,1≤d≤1000,S≠T,1≤S,T≤N。

    来源

    NOIP2012普及组第四题

    -------------------------------------------------------------------

    又是普及组数据超水系列

    i排斥j或i和j相同文化,d[i][j]=INF

    floyd轻松水果

     貌似标解是dfs

    #include <iostream>
    #include <cstdio>
    #include <algorithm>
    #include <cstring>
    #include <cmath>
    using namespace std;
    const int N=105,INF=1e9;
    int n,k,m,s,t,c[N],u,v,w,flag[N][N];
    int d[N][N];
    void floyd(){
        for(int k=1;k<=n;k++)
            for(int i=1;i<=n;i++)
                for(int j=1;j<=n;j++)
                    if(d[i][k]<INF&&d[k][j]<INF)
                        d[i][j]=min(d[i][j],d[i][k]+d[k][j]);
    }
    int main(){
        scanf("%d%d%d%d%d",&n,&k,&m,&s,&t);
        for(int i=1;i<=n;i++) scanf("%d",&c[i]);
        for(int i=1;i<=k;i++) for(int j=1;j<=k;j++) scanf("%d",&flag[i][j]);
        for(int i=1;i<=m;i++) {
            scanf("%d%d%d",&u,&v,&w);
            d[u][v]=d[v][u]=w; //printf("num%d
    ",i);
        }
        for(int i=1;i<=n;i++) 
            for(int j=1;j<=n;j++){
                if(d[i][j]==0) d[i][j]=INF;
                if(c[i]==c[j]) d[i][j]=INF;
                if(flag[c[i]][c[j]]) d[i][j]=INF;
            }
        floyd();
        int ans=min(d[s][t],d[t][s]);
        if(ans==INF) printf("-1");
        else printf("%d",ans);
    }

    数据太水了,不考虑学过的文化排斥也可以,灰哥随便造组数据就卡掉了

    4 4 5 1 4 1 2 3 4 0 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 1 2 1 1 3 1 2 3 1 1 4 1000 3 4 1

  • 相关阅读:
    GhostBSD 3.0RC3,基于GNOME的FreeBSD
    Nagios 3.4.3 发布,企业级监控系统
    Jolokia 1.0.6 发布, JMX远程访问方法
    微软希望开发人员不要使 WebKit 成为新版 IE6
    Kwort Linux 3.5 正式版发布
    EJDB 1.0.24 发布,嵌入式 JSON 数据库引擎
    Pale Moon 15.3 Firefox“苍月”优化版发布
    Galera Load Balancer 0.8.1 发布
    SmartSVN V7.5 正式发布
    PostgresQL建立索引如何避免写数据锁定
  • 原文地址:https://www.cnblogs.com/candy99/p/5850236.html
Copyright © 2011-2022 走看看