A:梦后楼台高锁,酒醒帘幕低垂

题目链接:http://acm.uestc.edu.cn/#/problem/show/1636

解法:首先,考虑到,我们需要找到一条路径,使它的最小边尽量大,最大边尽量小。然后,考虑到m比较小,我们可以去寻找一个m^2或者m^2logm的算法。考虑枚举最小边,那么我们就需要在m或者mlogm的时间内找到尽量小的最大边.回忆最小生成树的kruskal算法,并查集+贪心加边.应用到此题,从枚举的最小边贪心加边,当1和n属于同一个集合时停止,得出的一定是当前最小边情况下的最优解


#include <bits/stdc++.h>
using namespace std;
struct edge{int u,v,w;
}E[1010];
int n,m;
int fa[210],edgecnt;
bool cmp(edge a, edge b){return a.w<b.w;
}
int find_set(int x){if(x==fa[x]) return x;else return fa[x]=find_set(fa[x]);
}
void union_set(int x, int y){int fx=find_set(x),fy=find_set(y);if(fx!=fy){fa[fx]=fy;}
}
int main()
{while(~scanf("%d %d",&n,&m)){for(int i=1; i<=n; i++) fa[i]=i;for(int i=1; i<=m; i++){scanf("%d %d %d", &E[i].u,&E[i].v,&E[i].w);}sort(E+1,E+m+1,cmp);int ans=1e9;for(int i=1; i<=m; i++){for(int i=1; i<=n; i++) fa[i]=i;union_set(E[i].u,E[i].v);if(find_set(1)==find_set(n)){ans=0;break;}for(int j=i+1; j<=m; j++){union_set(E[j].u,E[j].v);if(find_set(1)==find_set(n)){ans=min(ans,E[j].w-E[i].w);break;}}}printf("%d\n", ans);}return 0;
}

B:去年春恨却来时,落花人独立,微雨燕双飞

题目链接:http://acm.uestc.edu.cn/#/problem/show/1633

解法:

对于S集合中的数,例如a1,考虑到如果x能够被表示出来,那么x+a1也一定能被表示出来。
故设d[r]为所有模a1余r的数中,能被表示出来的最小的数。
故可以表示出一个a1个节点a1*n条边的有向图。
d[0] = 0,丢入priority_queue<ii, vector<ii>, greater<ii>>,然后对于pq.top()的点连出的n条边进行松弛操作。
如果 d[u] + a[i] < d[(d[u] + a[i])] 则刷新并丢入队列。
跑出来的d[i],如果d[i] != INF则都是可以表示出来的。
对于每个询问判断 q >= d[q % a[1]]即可。
时间复杂度 O(mlogn)
空间复杂度 O(n), 不用存边。


#include <bits/stdc++.h>
using namespace std;
const int maxn = 2010;
const int maxm = 50010;
const int inf = 1e9+8;
int a[maxn], dis[maxm];
bool vis[maxm];
int n,m,x;
priority_queue<pair<int,int>,vector<pair<int,int> >, greater<pair<int,int> > >q;
void Dij()
{while(!q.empty()) q.pop();for(int i=0; i<maxm; i++) dis[i]=inf,vis[i]=0;memset(vis,false,sizeof(vis));dis[0]=0;q.push(make_pair(0,0));//first->num,second->num%a[1]while(!q.empty()){int u = q.top().second;int d = q.top().first;q.pop();if(vis[u]) continue;vis[u]=1;for(int i=1; i<=n; i++){if(d+a[i]<dis[(d+a[i])%a[1]]){dis[(d+a[i])%a[1]] = d+a[i];q.push(make_pair(d+a[i],(d+a[i])%a[1]));}}}
}int main()
{while(~scanf("%d",&n)){for(int i=1; i<=n; i++) scanf("%d", &a[i]);Dij();scanf("%d", &m);while(m--){scanf("%d", &x);if(x>=dis[(x%a[1])]){puts("YES");}else{puts("NO");}}}return 0;
}

C:记得小苹初见,两重心字罗衣
题目链接:http://acm.uestc.edu.cn/#/problem/show/1634

解法:把每个点看成边,每个横纵坐标看成一个点,得到一个无向图.如果新图中每个点的度都是偶数,那么就是一个欧拉图,对该图跑一遍欧拉回路,对走过的边轮流染色,就可以保证每个点所连的边的红蓝颜色相等.如果存在度数为奇数的点,新建两个点a和b.把横坐标的度数为奇数的点和a连边,把纵坐标为奇数的点和b连边,这样最多只有a和b的度数为奇数,可以跑欧拉路径.


#include <bits/stdc++.h>
using namespace std;
typedef pair<int,int> pii;
const int maxn = 2e5+6;
const int maxm = 3*2e5+6;
vector <pii> G[maxn*3];
vector <int> ans;
bool vis[maxm];
int anss[maxm];
int n;
inline void add(int x, int y, int z){G[x].push_back(pii(z,y));G[y].push_back(pii(z,x));
}
inline void dfs(int u){int v, e;while(!G[u].empty()){v = G[u].back().second, e = G[u].back().first;G[u].pop_back();if(!vis[e]){vis[e] = 1;dfs(v);ans.push_back(e);}}
}
int main()
{scanf("%d",&n);for(int i=1; i<=n; i++){int x, y;scanf("%d %d", &x, &y);add(x, y+maxn, i);}int st = -1, a = 2*maxn+1, b = a+1, cnt = n;for(int i=1; i <= 2*maxn; i++){int sz = G[i].size();if(sz){if(sz&1){if(i<=maxn){add(a, i, ++cnt);if(st != a) st = a;}else{add(b, i, ++cnt);if(st != b) st = b;}}if(st == -1) st = i;}}dfs(st);for(int i = 1; i <= 2*maxn; i++){if(G[i].size()){dfs(i);}}int sz = ans.size();for(int i = 0; i < sz; i++){if(ans[i] <= n){anss[ans[i]] = i&1;}}for(int i=1; i <=n ; i++){if(anss[i]) putchar('r');else putchar('b');}return 0;
}

D:琵琶弦上说相思,当时明月在,曾照彩云归
题目链接:http://acm.uestc.edu.cn/#/problem/show/1635

解法:

拓扑排序、bfs
对于相邻的2个字符串当第一次遇到不相等的字符是前一个u必定比比后一个v小,
所以可以u向v连一条有向边。
然后对于建出的这个图,跑一次拓扑排序即可。

#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
typedef pair<int,int> pii;
const int maxn = 1010;
char s[maxn][300];
vector <int> G[30];
queue <int> q1;
priority_queue <pii, vector<pii>, greater<pii> > q2;
int du[30];
bool vis[maxn];
void topsort()
{while(!q2.empty()){int u = q2.top().first;int fa = q2.top().second;q2.pop();q1.push(u);vis[u] = 1;for(int i = 0; i < G[u].size(); i++){int v = G[u][i];if(v == fa) continue;du[v]--;if(du[v] == 0){q2.push(pii(v, u));}}}
}
int main()
{int n, len1, len2;scanf("%d", &n);bool ans = 1;for(int i = 0; i < n; i++) scanf("%s", s[i]);for(int i = 0; i < n- 1; i++){len1 = strlen(s[i]);len2 = strlen(s[i+1]);bool flag = 0;for(int j = 0; j < min(len1, len2); j++){if(s[i][j] !=s[i+1][j]){flag = 1;G[s[i][j]-'a'].push_back(s[i+1][j]-'a');break;}}if(flag == 0){if(len1 > len2){ans = 0;break;}}}if(ans == 0){puts("-1\n");}else{for(int i = 0; i < 26; i++){for(int j = 0; j < G[i].size(); j++){du[G[i][j]]++;}}for(int i = 0; i < 26; i++){if(G[i].size() && du[i] == 0){q2.push(pii(i, -1));}}topsort();for(int i = 0; i < 26; i++){if(du[i] != 0){ans = 0;break;}}if(ans == 0){puts("-1");}else{int i = 0;while(!q1.empty()){while(vis[i]) i++;while(i < q1.front()){putchar(char('a'+i));i++;while(vis[i]) i++;}putchar(char('a'+q1.front())); q1.pop();}while(vis[i]) i++;while(i < 26){putchar(char('a' + i));i++;}printf("\n");}}return 0;
}

UESTC 图论专题 A-D相关推荐

  1. .[算法]图论专题之最短路径

    .[算法]图论专题之最短路径 作者:jasonkent27 转载请注明出处:www.cnblogs.com/jasonkent27 1. 前言 1.1 最短路引入 小明和小天现在住在海口(C1),他们 ...

  2. 图论专题-学习笔记:强连通分量

    图论专题-学习笔记:强连通分量 一些 update 1. 前言 2. 定义 3. 求法 4. 应用 5. 总结 一些 update update on 2021/8/12:增加了对于 Kosaraju ...

  3. 图论专题训练 (更新中)

    图论专题训练 A 题意: 一个国家里有很多个城市,某件物品在所有城市的价格都不同,你可以在一个城市买,另一个城市卖出来获得利益,但是只能进行一次买卖.然后要从1走到n,1到n有单向,也有双向的. 题解 ...

  4. 图论专题-学习笔记:虚树

    图论专题-学习笔记:虚树 1. 前言 2. 详解 2.1 虚树定义 2.2 虚树构造 2.3 例题 3. 总结 4. 参考资料 1. 前言 虚树,主要是用于一类树上问题,这类问题通常是需要取一些关键点 ...

  5. 【图论专题】图的存储与遍历(最小环、所有环的大小)

    整理的算法模板合集: ACM模板 目录 Part 8.1 图的存储与遍历 P2661 信息传递(最小环) P2921 Trick or Treat on the Farm(求所有环的大小) 题单链接: ...

  6. 【图论专题】最小生成树的扩展应用

    整理的算法模板合集: ACM模板 最小生成树的扩展应用 能用kruskal打死不用prim kruskal是要把所有的边都遍历一遍 图论中的超级源点就比较常用,要时刻想到它 题目列表: 题目 算法 A ...

  7. UESTC 2015dp专题 E 菲波拉契数制 dp

    菲波拉契数制 Time Limit: 20 Sec  Memory Limit: 256 MB 题目连接 http://acm.uestc.edu.cn/#/contest/show/65 Descr ...

  8. 2015 UESTC 数据结构专题H题 秋实大哥打游戏 带权并查集

    秋实大哥打游戏 Time Limit: 1 Sec  Memory Limit: 256 MB 题目连接 http://acm.uestc.edu.cn/#/contest/show/59 Descr ...

  9. 2015 UESTC 数据结构专题G题 秋实大哥去打工 单调栈

    秋实大哥去打工 Time Limit: 1 Sec  Memory Limit: 256 MB 题目连接 http://acm.uestc.edu.cn/#/contest/show/59 Descr ...

最新文章

  1. sys.check_constraints
  2. Java学习lesson 09
  3. SQL SERVER 使用 OPENRORWSET(BULK)函数将txt文件中的数据批量插入表中(2)
  4. python 均方误差_一个很随意的Python智能优化库,一个文件就是一个库-- PySwarm
  5. 大疆口袋云台存储卡_让拍摄更加安心,大疆无人机与口袋相机的存储卡选择:东芝M303E...
  6. 【Verilog HDL学习之路】第二章 Verilog HDL的设计方法学——层次建模
  7. C语言灵魂——算法!
  8. 仿微信选取图片发表朋友圈功能
  9. C++函数分文件编写
  10. 简书 c语言 指针,C语言-指针
  11. 人为什么要去旅行?旅行跟旅游的区别是什么?
  12. sudo apt-get install lsb-core
  13. 计算机楼综合布线设计图,现代综合大楼综合布线设计方案
  14. Android版本名称、版本号、API level对应关系
  15. EasyAR涂涂乐代码分析
  16. oracle 的乘法,Oracle group by 相乘
  17. 饥荒联机版服务器搭建过程--采取官网文档的方法
  18. 有关计算机英语作文素材,英语作文素材范文
  19. HDU-2544 最短路【最短路】
  20. 快速实战SQL (一) - 检索数据

热门文章

  1. 详细讲解西软FOXHIS增量备份与恢复
  2. 多mods的我的世界云服务器搭建(2021最新)
  3. js数组中的join(),reverse(),sort(),方法
  4. 范凯观点:Ruby社区应该去Rails化
  5. JSch - Examples - Exec.java
  6. 使用ICEM绘制非结构网格时,如何提高网格质量?【转载】
  7. 反爬虫①---浏览器断点调试
  8. 将docker应用并发布到远程服务器
  9. Python使用Opencv图像处理方法完成手势识别(一)
  10. MySQL“必知必会”的知识点