文化之旅(dijstra)
2012_p4 文化之旅 (culture.cpp/c/pas)
时间限制: 1 Sec 内存限制: 128 MB
提交: 43 解决: 16
[提交][状态][讨论版][命题人:外部导入]
题目描述
4.文化之旅
(culture.cpp/c/pas)
【问题描述】
有一位使者要游历各国,他每到一个国家,都能学到一种文化,但他不愿意学习任何一
种文化超过一次(即如果他学习了某种文化,则他就不能到达其他有这种文化的国家)。不
同的国家可能有相同的文化。不同文化的国家对其他文化的看法不同,有些文化会排斥外来
文化(即如果他学习了某种文化,则他不能到达排斥这种文化的其他国家)。
现给定各个国家间的地理关系,各个国家的文化,每种文化对其他文化的看法,以及这
位使者游历的起点和终点(在起点和终点也会学习当地的文化),国家间的道路距离,试求
从起点到终点最少需走多少路。
【输入】
输入文件 culture.in。
第一行为五个整数 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,两个国家之间可能有多条道路)。
【输出】
输出文件名为 culture.out。
输出只有一行,一个整数,表示使者从起点国家到达终点国家最少需要走的距离数(如
果无解则输出-1)。
【输入输出样例 1】
culture.in
2 2 1 1 2
1 2
0 1
1 0
1 2 10
culture.out
-1
【输入输出样例说明】
由于到国家 2 必须要经过国家 1,而国家 2 的文明却排斥国家 1 的文明,所以不可能到达国家 2。
【输入输出样例 2】
culture.in
2 2 1 1 2
1 2
0 1
0 0
1 2 10
culture.out
10
【输入输出样例说明】
路线为 1 -> 2。
【数据范围】
对于 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≤N2,1≤ki≤K,1≤u, v≤N,1≤d≤1000,
S≠T,1 ≤S, T≤N。
输入
输出
提示
#include <iostream>
#include <cstring>
#include <string>
#include <algorithm>
#define inf 0x3f3f3f3f
using namespace std;
int n,k,m,s,t;
int we[];
int g[][];
int e[][];
bool v[];
int d[];
void dijstra()
{
int i,j;
memset(v,,sizeof(v));
v[s]=;
for(i=;i<=n;i++) d[i]=e[s][i];
while()
{
int k=-;
int mm=inf;
for(i=;i<=n;i++)
{
if(!v[i]&&d[i]<mm)
{
k=i;
mm=d[i];
}
}
if(k==-) break;
v[k]=;
for(i=;i<=n;i++)
{
if(we[k]!=we[i]&&g[we[k]][we[i]]==&&d[i]>d[k]+e[k][i])
{
d[i]=d[k]+e[k][i];
}
}
}
} int main()
{
cin>>n>>k>>m>>s>>t;
int i,j;
for(i=;i<=n;i++)
for(j=;j<=n;j++)
{
if(i==j) e[i][j]=;
else e[i][j]=inf;
}
for(i=;i<=n;i++)
cin>>we[i];
for(i=;i<=k;i++)
{
for(j=;j<=k;j++)
cin>>g[i][j];
}
for(i=;i<=m;i++)
{
int x,y,z;
cin>>x>>y>>z;
if(e[x][y]>z)
{
e[x][y]=z;
e[y][x]=z;
}
}
dijstra();
if(d[t]==inf) cout<<"-1";
else cout<<d[t];
return ;
}
思路:题目很明显就是个最短路问题,关键点是到达一个国家后,要判断该国家的文化是否排斥使者已掌握的文化,
这个可以用bitset去进行记录,比较省空间,判断时的速度也更快
#include <iostream>
#include <cstdio>
#include <cstring>
#include <string>
#include <algorithm>
#include <map>
#include <set>
#include <stack>
#include <queue>
#include <vector>
#include <bitset>
#include <functional> using namespace std; #define LL long long
const int INF = 0x3f3f3f3f; struct node
{
int id, dis;
bitset<>x;//1表示学会的文化,0表示不会的文化
bool operator<(const node &a)const
{
return dis > a.dis;
}
}pre, nt1; int n, m, k, ss, tt;
int s[], nt[], e[], val[], dis[];
int a[];//每个国家的文化
bitset<>x[];//某一种文化对其他文化是否排斥,1表示排斥,0表示不排斥 void Dijkstra()
{
memset(dis, INF, sizeof dis);
dis[ss] = ;
pre.dis = , pre.id = ss, pre.x.reset();
pre.x[a[ss]] = ;
priority_queue<node>q;
q.push(pre);
while (!q.empty())
{
pre = q.top();
q.pop();
if (pre.id == tt) break;
for (int i = s[pre.id]; ~i; i = nt[i])
{
int ee = e[i];
if ((pre.x & x[a[ee]]) != || pre.x[a[ee]] != ) continue;
//该国家的文化对使者已掌握的文化排斥或者该文化使者已掌握则跳过
if (dis[ee] > dis[pre.id] + val[i])
{
dis[ee] = dis[pre.id] + val[i];
nt1.id = ee, nt1.dis = dis[ee];
nt1.x = pre.x;
nt1.x[a[ee]] = ;
q.push(nt1);
}
}
}
if (dis[tt] == INF) dis[tt] = -;
printf("%d\n", dis[tt]);
} int main()
{
while (~scanf("%d %d %d %d %d", &n, &k, &m, &ss, &tt))
{
int cnt = ;
memset(s, -, sizeof s);
for (int i = ; i <= n; i++) scanf("%d", &a[i]), x[i].reset();
for (int i = ; i <= k; i++)
{
int tmp;
for (int j = ; j <= k; j++)
{
scanf("%d", &tmp);
x[i][j] = tmp;//每个文化对其他文化是否排斥
}
}
for (int i = ; i < m; i++)
{
int u, v, w;
scanf("%d %d %d", &u, &v, &w);
nt[cnt] = s[u], s[u] = cnt, e[cnt] = v, val[cnt++] = w;
nt[cnt] = s[v], s[v] = cnt, e[cnt] = u, val[cnt++] = w;
}
Dijkstra();
}
return ;
}
文化之旅(dijstra)的更多相关文章
- [最短路]P1078 文化之旅
题目描述 有一位使者要游历各国,他每到一个国家,都能学到一种文化,但他不愿意学习任何一 种文化超过一次(即如果他学习了某种文化,则他就不能到达其他有这种文化的国家).不 同的国家可能有相同的文化.不同 ...
- 洛谷 P1078 文化之旅
P1078 文化之旅 题目描述 有一位使者要游历各国,他每到一个国家,都能学到一种文化,但他不愿意学习任何一种文化超过一次(即如果他学习了某种文化,则他就不能到达其他有这种文化的国家).不同的国家可能 ...
- 洛谷 P1078 文化之旅 解题报告
P1078 文化之旅 题目描述 有一位使者要游历各国,他每到一个国家,都能学到一种文化,但他不愿意学习任何一种文化超过一次(即如果他学习了某种文化,则他就不能到达其他有这种文化的国家).不同的国家可能 ...
- 洛谷P1078 文化之旅
P1078 文化之旅 1.1K通过 3.6K提交 题目提供者洛谷OnlineJudge 标签NOIp普及组2012 难度普及+/提高 时空限制1s / 128MB 提交 讨论 题解 最新讨论更多讨 ...
- java算法 蓝桥杯 文化之旅
问题描述 有一位使者要游历各国,他每到一个国家,都能学到一种文化,但他不愿意学习任何一种文化超过一次(即如果他学习了某种文化,则他就不能到达其他有这种文化的国家).不同的国家可能有相同的文化.不同文化 ...
- code1316 文化之旅
文化之旅的本质是最短路问题,只不过添加了一个文化排斥,仅需要做最短路时判断一下是否排斥即可 因为数据较小,采用了Floyd算法,以下是代码,关键部分附注释: #include<iostream& ...
- AC日记——文化之旅 洛谷 P1078
文化之旅 思路: 暴搜,倒搜: 代码: #include <bits/stdc++.h> using namespace std; #define maxn 105 #define max ...
- 【Floyd】文化之旅
[NOIP2012]文化之旅 题目描述 有一位使者要游历各国,他每到一个国家,都能学到一种文化,但他不愿意学习任何一 种文化超过一次(即如果他学习了某种文化,则他就不能到达其他有这种文化的国家).不 ...
- P1078 文化之旅
P1078 文化之旅 题目描述 有一位使者要游历各国,他每到一个国家,都能学到一种文化,但他不愿意学习任何一 种文化超过一次(即如果他学习了某种文化,则他就不能到达其他有这种文化的国家).不 同的国家 ...
随机推荐
- JNI_Z_08_创建Java对象
1.步骤 : (1).获取 jclass (2).获取 构造函数的 method id (方法的名称始终为"<init>") (3).创建Java对象的两种方式: (3 ...
- angularjs地址栏传参
1:路由定义参数 2.controller 3. 4.目标得到参数值
- Prism初研究之使用Prism实现WPF的MVVM模式
转自:http://www.cnblogs.com/qianzi067/p/5804880.html
- Django进阶Model篇006 - 多表关联查询
接着前面的例子,举例多表查询实例如下: 1.查询作战的所有完整信息. >>> AuthorDetail.objects.values('sex','email','address', ...
- C++构造函数知识点整理(C++11标准)
引言 构造函数是c++中的一个比较难的语法知识点.编程实践中,由于在很多情况下可以不显示定义构造函数,或者,虽然定义构造函数的方式并不十分适当,但是程序也能正常运行,故而并不是特别引起开发者的重视. ...
- Qt WebKit 学习的说明
(转自:http://it.100xuexi.com/view/otdetail/20120827/4021c662-b917-44d9-8284-910cac713c23.html) QT Webk ...
- Swagger实践和总结
Swagger学习和实践 最近安装并使用了一下Swagger-ui.Swagger-editor和Swagger-codegen,感觉还不错. Swagger 是一个规范和完整的框架,用于生成.描述. ...
- Git_学习_11_Git rebase合并提交信息
一.前言 二.操作过程 (1)先后两次进行文件修改,然后提交到本地仓库. (2)使用 git rebase -i origin/dev 来合并提交信息. 会弹出一个编辑框 p 07c5abd Intr ...
- lua基础---函数
Lua的函数功能很强大,保留了C语言的一些基本的特性,但是也有C语言没有的特性,比如,lua可以在一个函数返回多个值,我们来看看下面这个案例: 解释运行: lua test5.lua --定义一个函数 ...
- Arcgis Android API开发之离线地图
最近一直在倒腾Arcgis Android API等相关的东西,想把自己的做的图放到地图上去,也就是离线地图,穷人一般是没有钱的,一个月好几十的流量是开不起的,所以就左捉摸,右思考,看着API里面有离 ...