数据结构OJ作业——最短路、拓扑排序
来源:互联网 发布:胡公子淘宝店 编辑:程序博客网 时间:2024/06/05 18:55
poj3259 wormholes: http://poj.org/problem?id=3259
用spfa或者bellman-ford判断有无负环,我用的是spfa,使用cnt数组记录结点入队次数,次数大于等于n说明有负环。
#include <iostream>#include <cstdio>#include <cstring>#include <queue>using namespace std;const int MAX = 6000;int n,m,w;struct T{ int to,w,nt;};T edge[MAX];int cnt[510],head[510],visit[510];int cnte;queue<int> q;void add(int u, int v , int w){ edge[cnte].to = v; edge[cnte].w = w; edge[cnte].nt = head[u]; head[u] = cnte; cnte ++;}int spfa(void){ int dis[510]; memset(dis, 0x3f, sizeof(dis)); dis[1] = 0; visit[1] = 1; cnt[1] ++; q.push(1); while(!q.empty()) { int now = q.front(); q.pop(); visit[now] = 0; for (int i = head[now]; i; i = edge[i].nt) { if (dis[now] + edge[i].w < dis[edge[i].to]) { dis[edge[i].to] = dis[now] + edge[i].w; if (!visit[edge[i].to]) { cnt[edge[i].to] ++; if (cnt[edge[i].to] >= n) return 1; q.push(edge[i].to); visit[edge[i].to] = 1; } } } } return 0;}int main(int argc, char const *argv[]){ int f; scanf("%d",&f); while(f --) { scanf("%d%d%d",&n,&m,&w); cnte = 1; memset(cnt,0,sizeof(cnt)); memset(visit,0,sizeof(visit)); memset(head,0,sizeof(head)); memset(edge,0,sizeof(edge)); int a,b,v; for (int i = 0; i < m; i ++) { scanf("%d%d%d",&a,&b,&v); add(a,b,v); add(b,a,v); } for (int i = 0; i < w; i ++) { scanf("%d%d%d",&a,&b,&v); add(a,b,-v); } if (spfa() ) { puts("YES"); } else { puts("NO"); } } return 0;}
poj1270 Following Orders: http://poj.org/problem?id=1270
求有向图的全部拓扑序列,这里用的是递归+回溯的方法,比较坑的是输出要求是按字典序排序,贡献两发WA
#include <iostream>#include <cstdio>#include <algorithm>#include <cstring>#include <map>using namespace std;const int MAX = 30;int degree[MAX], cnt, matr[MAX][MAX], vis[MAX];char s[MAX], ans[MAX];map<char, int> mp;void init(void){ cnt = 0; mp.clear(); memset(matr, 0, sizeof(matr)); memset(vis, 0, sizeof(vis)); memset(s, 0, sizeof(s)); memset(degree, 0, sizeof(degree));}void dfstsort(int n); void solve(void){ dfstsort(1);}void dfstsort(int n){ if (n > cnt) { for (int i = 1; i <= cnt; i ++) { printf("%c",ans[i]); } printf("\n"); return ; } for (int i = 1; i <= cnt; i ++) { if (!vis[i] && degree[i] == 0) { ans[n] = s[i]; vis[i] = 1; for (int j = 1; j <= cnt; j ++) { if (matr[i][j]) { degree[j] --; } } dfstsort(n + 1); vis[i] = 0; for (int j = 1; j <= cnt; j ++) { if (matr[i][j]) { degree[j] ++; } } } }}int main(){ init(); char c, c1; int isenter = 0; int flag = 0, getc = 0; while ((c = getchar()) != EOF) { if (c == '\n') { ++ flag; // 字典序输出... if (flag == 1) { sort(s + 1, s + 1 + cnt); for (int i = 1; i <= cnt; i ++) { mp[s[i]] = i; } } if (flag == 2) {// for (int i = 1; i <= cnt; i ++) {// cout << degree[i] << " " ;// } solve(); init(); flag = 0; printf("\n"); } continue; } if (c == ' ') continue; if (flag == 0) { s[++ cnt] = c; } if (flag == 1) { if (getc == 0) { c1 = c; getc = 1; } else { matr[mp[c1]][mp[c]] = 1; degree[mp[c]] ++; getc = 0; } } } return 0;}
阅读全文
0 0
- 数据结构OJ作业——最短路、拓扑排序
- 「数据结构作业」最短路,拓扑排序,关键路径,最小生成树
- 最短路模板(二)——用拓扑排序解决有向无环图中的最短路
- 数据结构实验报告-图算法-最小生成树-最短路-拓扑排序-搜索
- 数据结构例程——拓扑排序
- poj1094Sorting It All Out 最短路前基础拓扑排序
- HDU4324 Triangle LOVE 最短路前基础铺垫拓扑排序
- HDU 4109 拓扑排序(最短路思想)关键路径
- 送外卖 拓扑排序+状压DP+最短路
- 最短路,最小生成树,及拓扑排序模板整理
- SDOI2009 Elaxia的路线(最短路+拓扑排序)
- [BZOJ1880][Sdoi2009] Elaxia的路线 (最短路,拓扑排序)
- [NOIP] [最短路] [拓扑排序] [DP] NOIP2017Day1 逛公园
- 九度OJ——1447最短路
- 数据结构OJ作业——图的遍历
- 数据结构OJ作业——最小生成树
- 数据结构——有向图(拓扑排序算法)
- 数据结构实践——拓扑排序算法验证
- C#中数组、ArrayList和List三者的区别
- 北大 AI 公开课第11讲:微软副总裁洪小文——AI+HI是终极智能形态
- 解决Android反编译XML文件乱码问题
- Android技术痛点——各种键盘挡住输入框终极解决办法
- HDU 2586 How far away ?(lca)
- 数据结构OJ作业——最短路、拓扑排序
- 用户用浏览器访问一个网站的时候背后的过程与步骤是怎样的?
- Intent使用详解
- Eclipse构建项目时"An internal error occurred during: "Building workspace". Java heap space"
- 机器学习知识点(三十)LDA话题模型Java实现
- 将项目发布到 maven 中央仓库踩过的坑
- java中拼音和中文互相转换
- 【mysql】根据不同条件查询表中同一字段
- 入门