Vijos P1794 文化之旅
标签:
搜索图结构
最短路
NOIP普及组2012
题目链接 : 点这里 。
这是一道最短路题目,一开始当做暴搜题目来做TLE很多次,想要优化却改成WrongAnswer。最后用SPFA 过了。
思路:最短路,松弛判断的时候判断文化之间是否排斥,用一个二维数组记录当前城市那些文化已经学习;这一个状态的文化 = 上一个状态的文化 + 此次学习的文化。dfs 会比较慢。
#include<stdio.h>
#include<string.h>
#include<iostream>
#include<algorithm>
#include<queue> using namespace std;
typedef long long int LL;
const int INF=2e9+1e8;
const int MAXSIZE=10000; int N,K,M,S,T; //题目信息
int first[MAXSIZE],knext[MAXSIZE],ntotal; //邻接表,这是邻接表的数组存储方式;
struct Edge
{
int s,t,val;
};
Edge edge[MAXSIZE];
int cultrue[MAXSIZE][MAXSIZE],city_cul[MAXSIZE]; //前者 记录文化之间的排斥关系,后面的巨鹿某一个城市的文化
bool learn[105][105]; //这个数组 下标 i,j . 表示走到 i 号城市 j文化 是否学习,学习了为 true; void init()// 初始化邻接表;
{
memset(first,-1,sizeof(first));
ntotal=0;
} void addedge(int s,int t,int val) //添加边函数
{
edge[ntotal].s=s,edge[ntotal].t=t,edge[ntotal].val=val;
knext[ntotal]=first[s];
first[s]=ntotal;
ntotal++;
}
bool check(int pre,int cul) //判断 前一个城市 pre 的文化
{
if(learn[pre][cul]) return false; // 如果当前文化之前已经学过 返回false
for(int i=1; i<=K; i++)
{
if(learn[pre][i]==true&&cultrue[cul][i]) return false; //如果上一个状态学过的文化 与 当前要学的排斥 false
}
return true; //否则 true
}
int spfa() //下面是 SPFA 模板 不懂上面有链接或者百度;
{
queue<int>q;
bool in_queue[200];
int dis[200];
for(int i=0; i<=110; i++)
dis[i]=INF;
memset(in_queue,0,sizeof(in_queue));
memset(learn,0,sizeof(learn));
dis[S]=0;
q.push(S);
in_queue[S]=1;
learn[S][city_cul[S]]=1;
while(!q.empty())
{
int k,x=q.front();
q.pop();
in_queue[x]=0;
k=first[x];
while(k+1)
{
int to=edge[k].t;
if(dis[x]+edge[k].val<dis[to]&&check(x,city_cul[to]))
{
learn[to][city_cul[to]]=true;
for(int jj=1;jj<=K;jj++)
{
if(learn[x][jj]) learn[to][jj]=1;
else learn[to][jj]=0;
}
dis[to]=dis[x]+edge[k].val;
if(!in_queue[to])
{
in_queue[to]=1;
q.push(to);
}
}
k=knext[k];
}
}
if(dis[T]==INF) return -1;
else return dis[T];
}
int main()
{
init();
scanf("%d%d%d%d%d",&N,&K,&M,&S,&T);
for(int i=1; i<=N; i++)
{
scanf("%d",&city_cul[i]);
}
for(int i=1; i<=K; i++)
{
for(int j=1; j<=K; j++)
scanf("%d",&cultrue[i][j]);
}
for(int i=0; i<M; i++)
{
int s,t,w;
scanf("%d%d%d",&s,&t,&w);
addedge(s,t,w);
addedge(t,s,w);
}
cout<<spfa()<<endl;
return 0;
}
Vijos P1794 文化之旅的更多相关文章
- [最短路]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]文化之旅 题目描述 有一位使者要游历各国,他每到一个国家,都能学到一种文化,但他不愿意学习任何一 种文化超过一次(即如果他学习了某种文化,则他就不能到达其他有这种文化的国家).不 ...
- 文化之旅(dijstra)
2012_p4 文化之旅 (culture.cpp/c/pas) 时间限制: 1 Sec 内存限制: 128 MB提交: 43 解决: 16[提交][状态][讨论版][命题人:外部导入] 题目描述 ...
随机推荐
- nodeJS一些事儿
node-webkit:开发桌面+WEB混合型应用的神器[大漠穷秋] 展望未来 其实这条路老早就有人在走 网上有很多人在争论,未来究竟是原生的应用会胜出,还是WEB APP会胜出,实际上这两者并不是你 ...
- Android动画中Interpolator 详解和演示
遇到一个项目需求,想让动画变得更活泼一点,于是想到了动画属性中的Interpolator,写了基本例子测试一下Android提供给我们现成的加速器的效果: 效果 代码中方法 xml中属性 越来越快 A ...
- ios You app information could not be saved. Try again. If the problem persists, contact us
ios You app information could not be saved. Try again. If the problem persists, contact us 大概意思:你的a ...
- DataGridView.DataSource= list(Of T)
注:本文样例的代码承接上篇文章:DataTable填充实体类返回泛型集合. 在D层查询完毕之后.我们将DataTable转化为泛型集合.然后经过中间各层,返回U层.到了这里,问题来了.我们这时候要将这 ...
- SpringBoot学习之@Controller和@RestController
今天我们来研究一下@Controller和@RestController的用法 @Controller 1.Controller可以用来跳转页面,并且必须配合模板来使用. @Controller // ...
- VC++的project文件
VC++的project文件说明: *.dsp:是VC++的项目文件,文本格式. *.dsw:是工作区文件,它能够指向一个或多个.dsp文件. *.clw:是 ClassWizard信息文件,实际上是 ...
- Spark MLlib Deep Learning Deep Belief Network (深度学习-深度信念网络)2.1
Spark MLlib Deep Learning Deep Belief Network (深度学习-深度信念网络)2.1 http://blog.csdn.net/sunbow0 Spark ML ...
- HDMI
HDMI,全称为(High Definition Multimedia Interface)高清多媒体接口,主要用于传输高清音视频信号. 现在是HDMI2.0.新一代的HDMI2.0较上一代最大的提升 ...
- 笔记09 saveFileDialog
C# saveFileDialog用法: #region 保存对话框private void ShowSaveFileDialog(){//string localFilePath, fileName ...
- JSP 随记
jstl <c:forEach> 遍历,多个<option>时显示"全部".单个 option时,默认选中! 引入:<%@ taglib prefix ...