P1078 文化之旅

题目描述

有一位使者要游历各国,他每到一个国家,都能学到一种文化,但他不愿意学习任何一种文化超过一次(即如果他学习了某种文化,则他就不能到达其他有这种文化的国家)。不同的国家可能有相同的文化。不同文化的国家对其他文化的看法不同,有些文化会排斥外来文化(即如果他学习了某种文化,则他不能到达排斥这种文化的其他国家)。

现给定各个国家间的地理关系,各个国家的文化,每种文化对其他文化的看法,以及这位使者游历的起点和终点(在起点和终点也会学习当地的文化),国家间的道路距离,试求从起点到终点最少需走多少路。

输入输出格式

输入格式:

第一行为五个整数 \(N,K,M,S,T\),每两个整数之间用一个空格隔开,依次代表国家个数(国家编号为1到\(N\)),文化种数(文化编号为1到\(K\)),道路的条数,以及起点和终点的编号(保证\(S\)不等于\(T\));

第二行为\(N\)个整数,每两个整数之间用一个空格隔开,其中第\(i\)个数\(C_i\),表示国家\(i\)的文化为\(C_i\)。

接下来的\(K\)行,每行\(K\)个整数,每两个整数之间用一个空格隔开,记第\(i\)行的第\(j\)个数为\(a_{ij}\),\(a_{ij}=1\)表示文化\(i\)排斥外来文化\(j\)(\(i\) 等于\(j\)时表示排斥相同文化的外来人),\(a_{ij}=0\)表示不排斥(注意\(i\)排斥\(j\)并不保证\(j\)一定也排斥\(i\))。

接下来的\(M\)行,每行三个整数\(u,v,d\) ,每两个整数之间用一个空格隔开,表示国家\(u\)与国家\(v\)有一条距离为\(d\)的可双向通行的道路(保证\(u\)不等于\(v\) ,两个国家之间可能有多条道路)。

输出格式:

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


UPT:这是个错题,无视吧。

这道题教会了我一个道理,当数据比较小时,只要复杂度正确,怎么暴力怎么来。

我唯唯诺诺了半天不敢直接写SPFA,最后一写居然就直接过了。

将SPFA中带结构体表示当前点还可以访问的文化,每次进点时多花一个\(O(N)\)处理就行了


#include <cstdio>
#include <cstring>
#include <queue>
using namespace std;
const int N=104;
int n,k,m,s,t;//k文化个数
int c[N],g[N][N],head[N],w[N*N],to[N*N],next[N*N],cnt=0,dis[N];
void add(int u,int v,int ww){next[++cnt]=head[u];to[cnt]=v;w[cnt]=ww;head[u]=cnt;}
struct node
{
int from,is[N];
};
queue <node > q;
void spfa()
{
node mes;
for(int i=1;i<=k;i++)
mes.is[i]=g[c[s]][i];
mes.from=s;
mes.is[c[s]]=0;
q.push(mes);
memset(dis,0x3f,sizeof(dis));
dis[s]=0;
while(!q.empty())
{
node tt=q.front();
q.pop();
for(int i=head[tt.from];i;i=next[i])
{
int v=to[i];
if(tt.is[c[v]]&&dis[tt.from]+w[i]<dis[v])
{
node tmp=tt;
dis[v]=dis[tt.from]+w[i];
for(int j=1;j<=k;j++)
if(!g[c[v]][j])
tmp.is[j]=0;
tmp.is[c[v]]=0;
tmp.from=v;
q.push(tmp);
}
}
}
if(dis[t]==0x3f3f3f3f) printf("-1\n");
else printf("%d\n",dis[t]);
}
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",&g[j][i]);
g[j][i]^=1;
}
int u,v,ww;
for(int i=1;i<=m;i++)
{
scanf("%d%d%d",&u,&v,&ww);
add(u,v,ww),add(v,u,ww);
}
spfa();
return 0;
}

2018.6.17

洛谷 P1078 文化之旅 解题报告的更多相关文章

  1. 洛谷P1078 文化之旅

    P1078 文化之旅 1.1K通过 3.6K提交 题目提供者洛谷OnlineJudge 标签NOIp普及组2012 难度普及+/提高 时空限制1s / 128MB 提交  讨论  题解 最新讨论更多讨 ...

  2. 洛谷 P1078 文化之旅

    P1078 文化之旅 题目描述 有一位使者要游历各国,他每到一个国家,都能学到一种文化,但他不愿意学习任何一种文化超过一次(即如果他学习了某种文化,则他就不能到达其他有这种文化的国家).不同的国家可能 ...

  3. 洛谷——P1078 文化之旅

    P1078 文化之旅 题目描述 有一位使者要游历各国,他每到一个国家,都能学到一种文化,但他不愿意学习任何一种文化超过一次(即如果他学习了某种文化,则他就不能到达其他有这种文化的国家).不同的国家可能 ...

  4. 洛谷 P1078 文化之旅(CODEVS 1316)

    题目描述 有一位使者要游历各国,他每到一个国家,都能学到一种文化,但他不愿意学习任何一 种文化超过一次(即如果他学习了某种文化,则他就不能到达其他有这种文化的国家).不 同的国家可能有相同的文化.不同 ...

  5. 洛谷_Cx的故事_解题报告_第四题70

    1.并查集求最小生成树 Code: #include <stdio.h> #include <stdlib.h>   struct node {     long x,y,c; ...

  6. 洛谷 P2317 [HNOI2005]星际贸易 解题报告

    P2317 [HNOI2005]星际贸易 题目描述 输入输出格式 输入格式: 输出格式: 如果可以找到这样的方案,那么输出文件output.txt中包含两个整数X和Y.X表示贸易额,Y表示净利润并且两 ...

  7. 洛谷 P3802 小魔女帕琪 解题报告

    P3802 小魔女帕琪 题目背景 从前有一个聪明的小魔女帕琪,兴趣是狩猎吸血鬼. 帕琪能熟练使用七种属性(金.木.水.火.土.日.月)的魔法,除了能使用这么多种属性魔法外,她还能将两种以上属性组合,从 ...

  8. 洛谷 P2606 [ZJOI2010]排列计数 解题报告

    P2606 [ZJOI2010]排列计数 题目描述 称一个\(1,2,...,N\)的排列\(P_1,P_2...,P_n\)是\(Magic\)的,当且仅当对所以的\(2<=i<=N\) ...

  9. 洛谷1303 A*B Problem 解题报告

    洛谷1303 A*B Problem 本题地址:http://www.luogu.org/problem/show?pid=1303 题目描述 求两数的积. 输入输出格式 输入格式: 两个数 输出格式 ...

随机推荐

  1. EZ 2018 06 10 NOIP2018 模拟赛(十八)

    好久没写blog&&比赛题解了,最近补一下 这次还是很狗的,T3想了很久最后竟然连并查集都忘写了,然后T2map莫名爆炸. Rating爆减......链接不解释 好了我们开始看题. ...

  2. [Oracle]快速生成大量模拟数据的方法

    快速生成大量模拟数据的方法: create table TEST(id integer, TEST_NUMBER NUMBER(18,6)); insert into TEST select i+j, ...

  3. Linq 之 Select 和 where 的用法

    最近开始学习linq.自己也总结一下,方便以后查阅. Select 同 Sql 中的 select 类似,即输出我们要的东东,感觉在 linq 中更加强大. Linq 可以对集合如数组.泛型等操作,这 ...

  4. C# 爬虫 正则、NSoup、HtmlAgilityPack、Jumony四种方式抓取小说

    心血来潮,想爬点小说.通过百度选择了个小说网站,随便找了一本小说http://www.23us.so/files/article/html/13/13655/index.html. 1.分析html规 ...

  5. ASS字幕制作

    虽然不常做视频,但正因为是偶尔用到,所以总是记不牢,特此笔记. Name 字体名称?Fontname 字体名称(\fn冬青黑体简体中文 W3)(\fnVogueSans)(例:\N{\fn冬青黑体简体 ...

  6. Mac下通过VMware Fusion安装centos虚拟机操作记录

    下面介绍下利用VMware Fusion工具在Mac上安装centos虚拟机的做法:1)下载VMware Fusion工具下载地址(包括注册码):http://www.macx.cn/thread-2 ...

  7. Linux运维笔记-日常操作命令总结(2)

    回想起来,从事linux运维工作已近5年之久了,日常工作中会用到很多常规命令,之前简单罗列了一些命令:http://www.cnblogs.com/kevingrace/p/5985486.html今 ...

  8. 一个数据表通过另一个表更新数据(在UPDAT语句中使用FROM子句)

    在sql server中,update可以根据一个表的信息去更新另一个表的信息. 首先看一下语法: update A SET 字段1=B表字段表达式, 字段2=B表字段表达式   from B WHE ...

  9. debug网页时小问题The source attachment does not contain the source for the file

    第一次debug总是出现下图问题,提示我没加源码... The source attachment does not contain the source for the file ... 解决方法: ...

  10. JavaScript封装方法,兼容参数类型为Number和String

    /** * 依据Kind确定跳转到目标列表页面. * @param kind */ function gobackByKind(kind) { var kindStr = String(kind); ...