标签:
                                        搜索图结构
最短路
                                   
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 文化之旅的更多相关文章

  1. [最短路]P1078 文化之旅

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

  2. 洛谷 P1078 文化之旅

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

  3. 洛谷 P1078 文化之旅 解题报告

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

  4. 洛谷P1078 文化之旅

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

  5. java算法 蓝桥杯 文化之旅

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

  6. code1316 文化之旅

    文化之旅的本质是最短路问题,只不过添加了一个文化排斥,仅需要做最短路时判断一下是否排斥即可 因为数据较小,采用了Floyd算法,以下是代码,关键部分附注释: #include<iostream& ...

  7. AC日记——文化之旅 洛谷 P1078

    文化之旅 思路: 暴搜,倒搜: 代码: #include <bits/stdc++.h> using namespace std; #define maxn 105 #define max ...

  8. 【Floyd】文化之旅

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

  9. 文化之旅(dijstra)

    2012_p4 文化之旅 (culture.cpp/c/pas) 时间限制: 1 Sec  内存限制: 128 MB提交: 43  解决: 16[提交][状态][讨论版][命题人:外部导入] 题目描述 ...

随机推荐

  1. lua——基础语法

    -- test lua: for learning lua grammar -- line comment --[[ block comment ]]-- -- print hello world p ...

  2. django 实现下载功能

    from django.http import FileResponse def download(request): if..... file=open([path],'rb') response= ...

  3. sql的一些知识_order by

    注释 SELECT name FROM userinfo #这是注释 /* 这是多行注释 */ order by 排序() SELECT username FROM userinfo ORDER BY ...

  4. Hibernate中的条件查询完毕类

    Hibernate中的条件查询有下面三个类完毕: 1.Criteria:代表一次查询 2.Criterion:代表一个查询条件 3.Restrictions:产生查询条件的工具类

  5. d3js 获取元素以及设置属性

    <!DOCTYPE html> <html lang="zh"> <head> <meta charset="UTF-8&quo ...

  6. Sencha touch 初体验

    一.什么是Sencha Touch? Sencha Touch是一个应用手持移动设备的前端js框架,与extjs是同一个门派的,它继承了extjs的优点和缺点.功能很强大,效果很炫丽,效率不高. 二. ...

  7. 利用display属性写出表格的布局样式

    demo地址:http://codepen.io/tianzi77/pen/gpBzjy 元素结构: <h1>display构造的table小样例,IE8及下面浏览器不支持本演示样例< ...

  8. 系统安全-PAM

    Pluggable Authentication Modules(可插入验证模块,简称PAM) Linux-PAM(Pluggable Authentication Modules for Linux ...

  9. php跳转

    header("Location: http://bbs. lampbrother.net"); header("refresh:0;url=./login.php&qu ...

  10. PHP获取IP

    <?php $iipp = $_SERVER["REMOTE_ADDR"]; echo $iipp ; ?>