文化之旅
第四题 文化之旅
#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。
不过或许是题和数据都太水了吧,水到少编一个条件都能做出正确结果,而且我看网上题解和我身边的所有人,所有人的代码(包括宋老师)都没有加这个条件。可怕。
哈哈打完了。