文化之旅

第四题 文化之旅

#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。

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

哈哈打完了。

                                       

猜你喜欢

转载自www.cnblogs.com/xxmxxm/p/10704530.html