vis

Bellman-Ford&&spfa(判负环)

主宰稳场 提交于 2020-04-08 04:35:23
题目链接 题意 : 有n个农场,m条双向路径u,v,t表示从u农场到v农场要花t时间,w个虫洞u,v,t,表示从u穿越到v时间倒流t。 问从任意一点出发,再回到出发点,能否在出发前时间到达出发点(时间倒流)。 解法 : Bellman-Ford算法(O(VE)) 算法核心 : 对所有边进行V-1次松弛操作,每一次松弛操作最少确定一点到源点的最短路径,所以最多v-1次可求出所有点到源点的最短路径。 最少一次就可以确定所有点的最短路径,即一条链依次更新。 判负环:如果存在负权环,则不存在最短路径。可以一直进行松弛操作。所以第V次对所有边进行松弛时,可以判断是否存在负权。 学习博客 //#include<bits/stdc++.h> #include <cstdio> #include <cstring> #include <cmath> #include <algorithm> #include <iostream> #include <string> #include <stdio.h> #include <queue> #include <stack> #include <map> #include <set> #include <string.h> #include <vector> #include <stdlib.h> using namespace std; typedef

ZOJ1406,POJ1251

一个人想着一个人 提交于 2020-04-07 05:52:24
题意:求连接所有村子的最短路 prim+邻接矩阵 1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 #include <cstdlib> 5 #include <algorithm> 6 using namespace std; 7 #define inf 999999 8 #define N 30 9 int n,dis[N],vis[N],g[N][N]; 10 11 int prim(int root) 12 { 13 for(int i=1; i<=n; i++) 14 dis[i]= g[i][root],vis[i]= 0; 15 dis[root]= 0; 16 vis[root]=1; 17 int cost= 0; 18 for(int T=1; T<=n-1; T++) 19 { 20 int mindis= inf,idx= -1; 21 for(int i=1; i<=n; i++) 22 { 23 if( vis[i]==0 ) 24 { 25 if( mindis>dis[i] ) 26 { 27 mindis= dis[i]; 28 idx= i; 29 } 30 } 31 } 32 cost+=mindis; 33 if( idx==-1 ) return -1; 34

POJ3134--IDDFS(迭代加深dfs)

不问归期 提交于 2020-04-06 17:50:34
题意: http://poj.org/problem?id=3134 应该好理解 思路: 枚举层数(也就是ans) dfs判断d到这个深度可不可以 +各种剪枝就能过 1 #define IOS ios_base::sync_with_stdio(0); cin.tie(0); 2 #include <cstdio>//sprintf islower isupper 3 #include <cstdlib>//malloc exit strcat itoa system("cls") 4 #include <iostream>//pair 5 #include <fstream>//freopen("C:\\Users\\13606\\Desktop\\Input.txt","r",stdin); 6 #include <bitset> 7 //#include <map> 8 //#include<unordered_map> 9 #include <vector> 10 #include <stack> 11 #include <set> 12 #include <string.h>//strstr substr strcat 13 #include <string> 14 #include <time.h>// srand(((unsigned)time(NULL)));

数据结构1 - 06-图1 列出连通集

倖福魔咒の 提交于 2020-04-04 18:05:16
1 #include<stdio.h> 2 #define MAXN 10 3 int g[MAXN][MAXN],vis[MAXN],n,e; 4 void init(); 5 void read(); 6 void BFS(int x); 7 void DFS(int x); 8 int main(){ 9 int i,j; 10 scanf("%d %d",&n,&e); 11 init(); 12 read(); 13 14 for(i=0;i<n;i++){ 15 if(vis[i]==0){ 16 printf("{"); 17 DFS(i); 18 printf(" }\n"); 19 } 20 } 21 for(i=0;i<n;i++) vis[i]=0; 22 for(i=0;i<n;i++){ 23 if(vis[i]==0){ 24 printf("{"); 25 BFS(i); 26 printf(" }\n"); 27 } 28 } 29 30 return 0; 31 } 32 void init(){ 33 int i,j; 34 for(i=0;i<n;i++) vis[i]=0; 35 for(i=0;i<n;i++) 36 for(j=0;j<n;j++){ 37 g[i][j]=0; 38 } 39 } 40 void read(){ 41

Codeforces Round #631 (Div. 2) - Thanks, Denis aramis Shitov!

眉间皱痕 提交于 2020-04-04 16:43:44
A. Dreamoon and Ranking Collection **给出一个人参加n场比赛的所有排名,假设他再参加x场比赛可以取得v,v表示1~v的所有排名他都取得过,求最大的v(这道题读了好久才读懂... ** 排名范围只有100,用数组标记枚举 #include<iostream> #include<string.h> #include<cstdio> #include<cmath> #include<algorithm> #include<queue> #include<vector> #include<string> #include<set> #include<map> using namespace std; typedef pair<int,int> PII; typedef long long LL; int vis[1010]; int main(){ int T; cin>>T; while(T--){ int n,x; cin>>n>>x; memset(vis,0,sizeof vis); for(int i=1,x;i<=n;++i){ cin>>x; vis[x]++; } int f; for(int i=1;i<1010;++i){ if(vis[i]==0) { if(x==0) { f=i-1; break; } --x; } } cout

[CF1187E] Tree Painting - 树形dp

孤街浪徒 提交于 2020-04-04 11:55:09
给定一棵 \(n\) 个点的树,初始全是白点,要求你做 \(n\) 步操作,每一次选定一个与一个黑点相隔一条边的白点,将它染成黑点,然后获得该白点被染色前所在的白色联通块大小的权值。第一次操作可以任意选点。求可获得的最大权值。 Solution 显然如果选定了开始点,那么答案就是固定的 设开始点为根,则答案为所有子树的大小和 设以 \(i\) 为根的答案为 \(f[i]\) 则显然有 \(f[v]-f[u] = n-2s[v]\) 两次 DFS 即可 #include <bits/stdc++.h> using namespace std; #define int long long const int N = 1000005; int n,f[N],s[N],t1,t2,vis[N]; vector <int> g[N]; void dfs1(int p) { vis[p]=1; s[p]=1; for(int q:g[p]) if(vis[q]==0) { dfs1(q); s[p]+=s[q]; } } void dfs2(int p) { vis[p]=1; for(int q:g[p]) if(vis[q]==0) { f[q]=f[p]+n-2*s[q]; dfs2(q); } } signed main() { ios::sync_with_stdio(false);

强连通专题

删除回忆录丶 提交于 2020-04-04 04:23:57
求割点(无向边): 所谓的割点,就是删除某个点,图便不连通了。 POJ 1523 #include<stdio.h> #include<string.h> #include<algorithm> using namespace std; const int MN=1111; struct Edge { int to,next; }edge[MN<<2]; int dfn[MN]; int low[MN]; int head[MN<<2]; int subnet[MN]; int E,tp,root; int vis[MN]; void Init() { memset(dfn,-1,sizeof(dfn)); memset(low,0,sizeof(low)); memset(head,-1,sizeof(head)); memset(subnet,0,sizeof(subnet)); memset(vis,0,sizeof(vis)); E=tp=0; } void Add(int a,int b) { edge[E].to=b; edge[E].next=head[a]; head[a]=E++; } void tarjan(int u,int fa) { int son=0; vis[u]=1; dfn[u]=low[u]=++tp; for(int i=head[u];i!=

专题训练之强连通分量

北城余情 提交于 2020-04-04 04:23:18
tarjan模板 1 #include<cstdio> 2 #include<cstring> 3 #include<algorithm> 4 using namespace std; 5 const int maxn=20010; 6 const int maxm=50010; 7 struct edge{ 8 int to,nxt; 9 }edge[maxm]; 10 int head[maxn],tot; 11 int low[maxn],dfn[maxn],stack[maxn],belong[maxn]; 12 int index,top; 13 int scc; 14 bool vis[maxn]; 15 int num[maxn]; 16 17 void addedge(int u,int v) 18 { 19 edge[tot].to=v; 20 edge[tot].nxt=head[u]; 21 head[u]=tot++; 22 } 23 24 void tarjan(int u) 25 { 26 int v; 27 low[u]=dfn[u]=++index; 28 stack[top++]=u; 29 vis[u]=true; 30 for ( int i=head[u];i!=-1;i=edge[i].nxt ) { 31 v=edge[i].to; 32

24点游戏&&速算24点(dfs)

て烟熏妆下的殇ゞ 提交于 2020-03-30 09:29:41
24点游戏 Time Limit: 3000/1000MS (Java/Others) Memory Limit: 65535/65535KB (Java/Others) Submit Status 24 24点就是给你一串数字,问你是否通过加减乘除括号构成 24 24点。 沈爷觉得这个很好玩,就决定考考你,给你 4 4个数,可以交换位置,可以用加减乘除和括号,是否能构成 24 24点呢? 注意哦~这里的除法并不是整数除法,比如样例 Input 第一行 T T,表示有多少组测试数据, 1 ≤ T ≤ 50 1≤T≤50 接下来 T T行,每行 4 4个正整数 a 1 a1, a 2 a2, a 3 a3, a 4 a4,表示每个数都是多少, 1 ≤ a i ≤ 13 1≤ai≤13 Output 对于每一次询问,如果能够凑成 24 24点,输出 yes ,否则输出 no Sample input and output Sample Input Sample Output 2 3 3 8 8 1 1 1 1 yes no Hint 3 3 3 3 8 8 8 8 就可以构造出 8 ÷ ( 3 – 8 ÷ 3 ) = 24 题解:求24点,暴力搜索下就好,刚开始我想着全排列下,然后按照顺序来进行,但是思路明显不完善,然后看了大神的, 大神是延长数组存放当前运算的解,vis记录是否用过

CCF 2016-12 送货

柔情痞子 提交于 2020-03-29 09:14:02
问题描述 试题编号: 201512-4 试题名称: 送货 时间限制: 1.0s 内存限制: 256.0MB 问题描述: 问题描述   为了增加公司收入,F公司新开设了物流业务。由于F公司在业界的良好口碑,物流业务一开通即受到了消费者的欢迎,物流业务马上遍及了城市的每条街道。然而,F公司现在只安排了小明一个人负责所有街道的服务。   任务虽然繁重,但是小明有足够的信心,他拿到了城市的地图,准备研究最好的方案。城市中有n个交叉路口,m条街道连接在这些交叉路口之间,每条街道的首尾都正好连接着一个交叉路口。除开街道的首尾端点,街道不会在其他位置与其他街道相交。每个交叉路口都至少连接着一条街道,有的交叉路口可能只连接着一条或两条街道。   小明希望设计一个方案,从编号为1的交叉路口出发,每次必须沿街道去往街道另一端的路口,再从新的路口出发去往下一个路口,直到所有的街道都经过了正好一次。 输入格式   输入的第一行包含两个整数n, m,表示交叉路口的数量和街道的数量,交叉路口从1到n标号。   接下来m行,每行两个整数a, b,表示和标号为a的交叉路口和标号为b的交叉路口之间有一条街道,街道是双向的,小明可以从任意一端走向另一端。两个路口之间最多有一条街道。 输出格式   如果小明可以经过每条街道正好一次,则输出一行包含m+1个整数p 1 , p 2 , p 3 , ..., p m +1