zoukankan      html  css  js  c++  java
  • 文化之旅

    第四题 文化之旅

    #include<bits/stdc++.h>

    using namespace std;

    int maxn=0x3f3f3f,n,k,m,s,t,u,v,d,a[10001],p[10001][10001],s1[10001][10001];

    int main(){

    cin>>n>>k>>m>>s>>t;

    for(int i=1;i<=n;i++)

    {

    cin>>a[i];

    }

    for(int i=1;i<=k;i++)

    for(int j=1;j<=k;j++)

    {

    cin>>p[i][j];

    }

    for(int i=1;i<=n;i++)

    for(int j=1;j<=n;j++)

    {

    s1[i][j]=maxn;

    }

    for(int i=1;i<=m;i++)

    {

    cin>>u>>v>>d;

    s1[u][v]=s1[v][u]=d;

    }

    for(int i=1;i<=n;i++)

    for(int j=1;j<=n;j++)

    {

    if(p[a[i]][a[j]])

    s1[i][j]=maxn;

    }

    for(int k=1;k<=n;k++)

    for(int i=1;i<=n;i++)

    for(int j=1;j<=n;j++)

    {

    if(i!=k&&k!=j&&j!=i)

    {

    s1[i][j]=min(s1[i][j],s1[i][k]+s1[k][j]);

    }

    }

        s1[s][t]==maxn?cout<<-1:cout<<s1[s][t];

    return 0;

    }                 

    咳咳,题目本身没什么难度,甚至早就被证实是一道错题,可因为它是图论,有关于图论的知识早就忘完了,哪怕是最最简单最最耗时的弗洛伊德算法我都忘得一干二净。听着弗洛伊德这四个字我居然有种陌生感,虽然我们学过。

    所以这也提醒了图论这个版块我现在的掌握程度太差。

    思路如下:

    输入数据,走不通的,我们这样

    for(int i=1;i<=n;i++)

    for(int j=1;j<=n;j++)

    {

    s1[i][j]=maxn;

    }

    for(int i=1;i<=m;i++)

    {

    cin>>u>>v>>d;

    s1[u][v]=s1[v][u]=d;

    }

    凡是被排斥的,我们这样

    for(int i=1;i<=n;i++)

    for(int j=1;j<=n;j++)

    {

    if(p[a[i]][a[j]])

    s1[i][j]=maxn;

    }

    然后?弗洛伊德算法,over!!!!

    for(int k=1;k<=n;k++)

    for(int i=1;i<=n;i++)

    for(int j=1;j<=n;j++)

    {

    if(i!=k&&k!=j&&j!=i)

    {

    s1[i][j]=min(s1[i][j],s1[i][k]+s1[k][j]);

    }

    }

    慢着,我们似乎忘了些什么。

    做到这里其实已经ac了,可题目明明还有一个条件没用啊!!!

    但他不愿意学习任何一种文化超过一次(即如果他学习了某种文化,则他就不能到达其他有这种文化的国家)。

    我认为应该这样改一下

    for(int i=1;i<=n;i++)

    for(int j=1;j<=n;j++)

    {

    if(p[a[i]][a[j]]||a[i]==a[j])(添加:两个国家文化相同则不相通)

    s1[i][j]=maxn;

    }

    for(int k=1;k<=n;k++)

    for(int i=1;i<=n;i++)

    for(int j=1;j<=n;j++)

    {

    if(i!=k&&k!=j&&j!=i&&a[i]!=a[j])(添加:两个国家文化相同则无法以任何形式求出其中的最短路)

    {

    s1[i][j]=min(s1[i][j],s1[i][k]+s1[k][j]);

    }

    }

    然后测试,结果依然ac。

    不过或许是题和数据都太水了吧,水到少编一个条件都能做出正确结果,而且我看网上题解和我身边的所有人,所有人的代码(包括宋老师)都没有加这个条件。可怕。

    哈哈打完了。

                                           

  • 相关阅读:
    shell内置命令eval的具有什么作用
    openwrt中如何在一个软件包中使能busybox中的工具
    go语言中strings包中的Trim函数的作用是什么
    RedisTemplate的各种操作(set、hash、list、string)
    Spring data redis-StringRedisTemplate 用法
    Spring-data-redis 第一天
    Java操作Redis数据
    BootStrap之X-editable插件使用
    bootstrap editable有默认值
    bootstrap editable初始化后表单
  • 原文地址:https://www.cnblogs.com/xxmxxm/p/10704530.html
Copyright © 2011-2022 走看看