luogu P1078 文化之旅 dfs floyd

我们当前在点x,已经走了路径为len的长度。准备到i点。 那么从x到i,在刚刚floyd不完全的考虑文化影响的前提下,最短路为mp[x][i]。 从i到t,在刚刚floyd不完全的考虑文化影响的前提下,最短路为mp[i][t]。 如果len + mp[x][t]+mp[x][i] 都长于当前已经搜到的最优ans。 那么显然从x到i这一步是没有意义的,就可以剪枝了。

 1 #include<cstdio>
 2 #include<cstring>
 3 #include<algorithm>
 4 using namespace std;
 5 const int MAXN = 110;
 6 int ans,n,k,m,s,t;
 7 int c[MAXN],map[MAXN][MAXN],q[MAXN];
 8 bool b[MAXN][MAXN],flag[MAXN];
 9 void dfs(int x,int len)
10 {
11     if(x == t)
12     {
13         ans = min(ans,len);
14         return;
15     }
16     int l,r;
17     for(int i = 1; i <= n; i++)
18         if(!flag[i] && ans - len - map[x][i] > map[i][t])
19         {
20             l = q[0] + 1;
21             q[++q[0]] = i;
22             flag[i] = 1;
23             for(int j = 1; j <= n; j++)
24                 if(!flag[j] && b[c[j]][c[i]])
25                 {
26                     q[++q[0]] = j;
27                     flag[j] = 1;
28                 }
29             r = q[0];
30             dfs(i,len + map[x][i]);
31             for(int j = l; j <= r; j++)
32                 flag[q[j]] = 0;
33             q[0] = l - 1;
34         }
35 }
36 void floyd()
37 {
38     for(int k = 1; k <= n; k++)
39         for(int i = 1; i <= n; i++)
40             if(!b[c[k]][c[i]])
41                 for(int j = 1; j <= n; j++)
42                     if(!b[c[j]][c[k]] && !b[c[j]][c[i]])
43                         if(map[i][j] - map[i][k] > map[k][j])
44                             map[i][j] = map[i][k] + map[k][j];
45 }
46 int main()
47 {
48     scanf("%d%d%d%d%d",&n,&k,&m,&s,&t);
49     for(int i = 1; i <= n; i++)
50         scanf("%d",&c[i]);
51     for(int i = 1; i <= k; i++)
52         for(int j = 1; j <= k; j++)
53             scanf("%d",&b[i][j]);
54     for(int i = 1; i <= k; i++)
55         b[i][i] = 1;
56     if(b[c[t]][c[s]])
57     {
58         printf("-1\n");
59         return 0;
60     }
61     memset(map,0x1f,sizeof(map));
62     int tu,tv,td;
63     for(int i = 1; i <= m; i++)
64     {
65         scanf("%d%d%d",&tu,&tv,&td);
66         map[tu][tv] = map[tv][tu] = td;
67     }
68     for(int i = 1; i <= n; i++)
69         map[i][i] = 0;
70     floyd();
71     for(int i = 1;i <= n;i++)
72         if(i != s && i != t)
73             if(b[c[i]][c[s]] || b[c[t]][c[i]])
74             {
75                 q[++q[0]] = i;
76                 flag[i] = 1;
77             }
78     ans = map[0][0];
79     q[++q[0]] = s;
80     flag[s] = 1;
81     dfs(s,0);
82     if(ans == map[0][0])
83         printf("-1\n");
84     else
85         printf("%d\n",ans);
86     return 0;
87 }

原文地址:https://www.cnblogs.com/iat14/p/11479352.html

时间: 2024-08-02 05:00:01

luogu P1078 文化之旅 dfs floyd的相关文章

Floyd 洛谷P1078 文化之旅

P1078 文化之旅 题目描述 有一位使者要游历各国,他每到一个国家,都能学到一种文化,但他不愿意学习任何一 种文化超过一次(即如果他学习了某种文化,则他就不能到达其他有这种文化的国家).不 同的国家可能有相同的文化.不同文化的国家对其他文化的看法不同,有些文化会排斥外来 文化(即如果他学习了某种文化,则他不能到达排斥这种文化的其他国家). 现给定各个国家间的地理关系,各个国家的文化,每种文化对其他文化的看法,以及这 位使者游历的起点和终点(在起点和终点也会学习当地的文化),国家间的道路距离,试

洛谷P1078 文化之旅

P1078 文化之旅 1.1K通过 3.6K提交 题目提供者洛谷OnlineJudge 标签NOIp普及组2012 难度普及+/提高 时空限制1s / 128MB 提交  讨论  题解 最新讨论更多讨论 RE....??? 10分思路 单源最短路径.代码~ 求高手,为什么只有90分 神奇的数据 错误的算法也能过,数据太水- 题目描述 有一位使者要游历各国,他每到一个国家,都能学到一种文化,但他不愿意学习任何一 种文化超过一次(即如果他学习了某种文化,则他就不能到达其他有这种文化的国家).不 同的

[最短路]P1078 文化之旅

题目描述 有一位使者要游历各国,他每到一个国家,都能学到一种文化,但他不愿意学习任何一 种文化超过一次(即如果他学习了某种文化,则他就不能到达其他有这种文化的国家).不 同的国家可能有相同的文化.不同文化的国家对其他文化的看法不同,有些文化会排斥外来 文化(即如果他学习了某种文化,则他不能到达排斥这种文化的其他国家). 现给定各个国家间的地理关系,各个国家的文化,每种文化对其他文化的看法,以及这 位使者游历的起点和终点(在起点和终点也会学习当地的文化),国家间的道路距离,试求 从起点到终点最少需

P1078 文化之旅

P1078 文化之旅 题目描述 有一位使者要游历各国,他每到一个国家,都能学到一种文化,但他不愿意学习任何一 种文化超过一次(即如果他学习了某种文化,则他就不能到达其他有这种文化的国家).不 同的国家可能有相同的文化.不同文化的国家对其他文化的看法不同,有些文化会排斥外来 文化(即如果他学习了某种文化,则他不能到达排斥这种文化的其他国家). 现给定各个国家间的地理关系,各个国家的文化,每种文化对其他文化的看法,以及这 位使者游历的起点和终点(在起点和终点也会学习当地的文化),国家间的道路距离,试

洛谷——P1078 文化之旅

P1078 文化之旅 题目描述 有一位使者要游历各国,他每到一个国家,都能学到一种文化,但他不愿意学习任何一种文化超过一次(即如果他学习了某种文化,则他就不能到达其他有这种文化的国家).不同的国家可能有相同的文化.不同文化的国家对其他文化的看法不同,有些文化会排斥外来 文化(即如果他学习了某种文化,则他不能到达排斥这种文化的其他国家). 现给定各个国家间的地理关系,各个国家的文化,每种文化对其他文化的看法,以及这位使者游历的起点和终点(在起点和终点也会学习当地的文化),国家间的道路距离,试求从起

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

文化之旅 思路: 暴搜,倒搜: 代码: #include <bits/stdc++.h> using namespace std; #define maxn 105 #define maxm 200005 #define INF 0x7fffffff int n,k,m,s,t,E[maxm],V[maxm],head[maxn]; int cnt,W[maxm],num[maxn],ci[maxn],ans=INF; bool map_[maxn][maxn],if_[maxn]; inli

【Floyd】文化之旅

[NOIP2012]文化之旅 题目描述 有一位使者要游历各国,他每到一个国家,都能学到一种文化,但他不愿意学习任何一 种文化超过一次(即如果他学习了某种文化,则他就不能到达其他有这种文化的国家).不 同的国家可能有相同的文化.不同文化的国家对其他文化的看法不同,有些文化会排斥外来 文化(即如果他学习了某种文化,则他不能到达排斥这种文化的其他国家). 现给定各个国家间的地理关系,各个国家的文化,每种文化对其他文化的看法,以及这 位使者游历的起点和终点(在起点和终点也会学习当地的文化),国家间的道路

NOIP2012pj文化之旅[floyd]

描述 有一位使者要游历各国,他每到一个国家,都能学到一种文化,但他不愿意学习任何一种文化超过一次,即如果他学习了某种文化,则他就不能到达其他有这种文化的国家.不同的国家可能有相同的文化.不同文化的国家对其他文化的看法不同,有些文化会排斥外来文化,即如果他学习了某种文化,则他不能到达排斥这种文化的其他国家. 现给定各个国家间的地理关系,各个国家的文化,每种文化对其他文化的看法,以及这位使者游历的起点和终点(在起点和终点也会学习当地的文化),国家间的道路距离,试求从起点到终点最少需走多少路. 格式

2012文化之旅

题目描述 Description 有一位使者要游历各国,他每到一个国家,都能学到一种文化,但他不愿意学习任何一种文化超过一次(即如果他学习了某种文化,则他就不能到达其他有这种文化的国家).不同的国家可能有相同的文化.不同文化的国家对其他文化的看法不同,有些文化会排斥外来文化(即如果他学习了某种文化,则他不能到达排斥这种文化的其他国家). 现给定各个国家间的地理关系,各个国家的文化,每种文化对其他文化的看法,以及这位使者游历的起点和终点(在起点和终点也会学习当地的文化),国家间的道路距离,试求从起