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[提交][状态][讨论版][命题人:外部导入] 题目描述 ...
随机推荐
- lua——基础语法
-- test lua: for learning lua grammar -- line comment --[[ block comment ]]-- -- print hello world p ...
- django 实现下载功能
from django.http import FileResponse def download(request): if..... file=open([path],'rb') response= ...
- sql的一些知识_order by
注释 SELECT name FROM userinfo #这是注释 /* 这是多行注释 */ order by 排序() SELECT username FROM userinfo ORDER BY ...
- Hibernate中的条件查询完毕类
Hibernate中的条件查询有下面三个类完毕: 1.Criteria:代表一次查询 2.Criterion:代表一个查询条件 3.Restrictions:产生查询条件的工具类
- d3js 获取元素以及设置属性
<!DOCTYPE html> <html lang="zh"> <head> <meta charset="UTF-8&quo ...
- Sencha touch 初体验
一.什么是Sencha Touch? Sencha Touch是一个应用手持移动设备的前端js框架,与extjs是同一个门派的,它继承了extjs的优点和缺点.功能很强大,效果很炫丽,效率不高. 二. ...
- 利用display属性写出表格的布局样式
demo地址:http://codepen.io/tianzi77/pen/gpBzjy 元素结构: <h1>display构造的table小样例,IE8及下面浏览器不支持本演示样例< ...
- 系统安全-PAM
Pluggable Authentication Modules(可插入验证模块,简称PAM) Linux-PAM(Pluggable Authentication Modules for Linux ...
- php跳转
header("Location: http://bbs. lampbrother.net"); header("refresh:0;url=./login.php&qu ...
- PHP获取IP
<?php $iipp = $_SERVER["REMOTE_ADDR"]; echo $iipp ; ?>