首页 > 其他分享 >ACM预备队-week9(图论2)

ACM预备队-week9(图论2)

时间:2023-01-02 20:33:15浏览次数:47  
标签:图论 int ACM week9 vis ans now 模板 dis

1.查找文献:

题目链接:P5318 【深基18.例3】查找文献 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 const int M = 1e6 + 5;
 4 vector< int >f[M];
 5 queue<int>Q;
 6 bool vis[M];//全局变量一开始全部为0
 7 void dfs(int x)
 8 {
 9     cout << x << " ";
10     for (int i = 0; i < f[x].size(); i++)
11     {
12         int next = f[x][i];
13         if (!vis[next])
14         {
15             vis[next] = true;
16             dfs(next);
17         }
18     }
19 }
20 int main()
21 {
22     int n, m;
23     cin >> n >> m;
24     for (int i = 0; i < m; i++)
25     {
26         int x, y;
27         cin >> x >> y;
28         f[x].push_back(y);
29     }
30     for (int i = 0; i < m; i++)
31     {
32         sort(f[i].begin(), f[i].end());
33     }
34     vis[1] = 1;
35     dfs(1);
36     cout << endl;
37     memset(vis, 0, sizeof(vis));//重新初始化
38     Q.push(1); vis[1] = 1;//bfs
39     while (!Q.empty())
40     {
41         int X = Q.front(); Q.pop();
42         cout << X << " ";
43         for (int i = 0; i < f[X].size(); i++)
44         {
45             int next = f[X][i];
46             if (!vis[next])
47             {
48                 vis[next]=1;
49                 Q.push(next);
50             }
51         }
52     }
53     return 0;
54 }

2.Floyd

题目链接:U80592 【模板】floyd - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 #define ll long long
 4 const ll INF = 1e9 + 10, MOD = 998244354,M=505;
 5 ll f[M][M];
 6 int main()
 7 {
 8     int n, m;
 9     cin >> n >> m;
10     /*memset(f, INF, sizeof(f));不建议使用,其实和遍历时间复杂度一样*/
11     for (int i = 1; i <= n; i++)
12     {
13         for (int j = 1; j <= n; j++) {
14             if (i == j)f[i][j] == 0;
15             else
16             {
17                 f[i][j] = INF;//赋初值
18             }
19             
20         }
21     }
22      
23     for (int i = 1; i <= m; i++)
24     {
25         ll x, y, l;
26         cin >> x >> y >> l;
27         f[x][y] = min(l,f[x][y]);
28         f[y][x] = min(l, f[y][x]);//有重复的路径但是路程不同取最短路程
29     }
30  
31     for (int k = 1; k <= n; k++)
32     {
33         for (int i = 1; i <= n; i++)
34         {
35             for (int j = 1; j <= n; j++)
36             {
37                 f[i][j] = min(f[i][j], f[i][k] + f[k][j]);
38             }
39         }
40     }
41     for (int i = 1; i <= n; i++) {
42         ll sum = 0;
43         for (int j = 1; j <= n; j++) {
44             sum = (sum + f[i][j]) % MOD;
45         }
46         cout << sum << endl;
47     }
48     return 0;
49 }

3.【模板】单源最短路径(标准版)

题目链接:P4779 【模板】单源最短路径(标准版) - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 const int maxn = 1e5 + 50, INF = 1e9 + 1000,maxm=5e5+50;
 4 struct edge
 5 {
 6     int next;//同一个起点的上一个点
 7     int to;//终点
 8     int dis;//权值
 9 };
10 edge e[maxm];
11 int ans[maxn];
12 bool vis[maxn];
13 int head[maxn],tot;
14 inline void add_edge(int st, int ed, int dis)//链式前向星的模板
15 {
16     e[++tot].dis = dis;
17     e[tot].to = ed;
18     e[tot].next = head[st];
19     head[st] = tot;
20 }
21 struct node
22 {
23     int now;
24     int dis;
25     bool operator < (const node& x)const
26     {
27         return x.dis < dis;
28     }
29 };
30 priority_queue<node>Q;//由小到大
31 int main()
32 {
33     int n, m, s;
34     cin >> n >> m >> s;
35     for (int i = 1; i <= n; i++)ans[i] = INF;
36     ans[s] = 0;
37     for (int i = 0; i < m; i++)
38     {
39         int u, v, w;
40         cin >> u >> v >> w;
41         add_edge(u, v, w);
42     }
43     Q.push({ s,0 });
44     while (!Q.empty())//dijkstra模板
45     {
46         auto X = Q.top();
47         Q.pop();
48         int now = X.now;
49         if (vis[now])continue;
50         vis[now] = 1;
51         for (int i = head[now]; i; i = e[i].next)//链式前向星遍历模板
52         {
53             int Y = e[i].to;
54             if (ans[Y] > ans[now] + e[i].dis)
55             {
56                 ans[Y] = ans[now] + e[i].dis;
57                 if (!vis[Y])
58                 {
59                     Q.push({ Y, ans[Y] });
60                 }
61             }
62         }
63     }
64     for (int i = 1; i <= n; i++)
65     {
66         cout << ans[i] << " ";
67     }
68     return 0;
69 }

 

标签:图论,int,ACM,week9,vis,ans,now,模板,dis
From: https://www.cnblogs.com/Zac-saodiseng/p/17020470.html

相关文章

  • SZTUACM寒假周报(2022.12.24~2023.1.1)
    SZTUACM寒假周报(2022.12.24~2023.1.1)杂项——搜索专题知识整理前言:因为之前搜索学得很随意,知识点很杂,加上期末一直在赶ddl,投入训练时间很少,所以本周决定整理一下有关搜......
  • 通关搜索和图论 day_12 -- DFS&BFS
    DFS深度优先搜索会搜得比较深,当搜到叶子结点的时候就会回溯graphTD;a-->b-->d-->i-->ra-->c-->g-->nb-->e-->kb-->f-->mc-->h-->pd-->je-->lg-->oh-->qi-->s......
  • HHUACM2023寒假集训(低年级组)信息汇总
    第一周(1.2-1.8):基础算法题单链接:低年级组集训第一周:基础算法(一),低年级组集训第一周:基础算法(二)第二周(1.9-1.15):简单数学TODO第三周(1.16-1.22):数据结构基础TODO......
  • CCNUACM寒假培训第二周周赛部分题解(ACF)
    A题大意:给出n个数,每次可以选择任意一个数进行加一操作,可执行k次,求最大值可能的最大最小值考虑最大值最大,即所有操作都对初始n个数中的最大值进行,答案即max(a1,.....,an)+......
  • 算法之Floyd-Warshall算法【c++】【图论】【最短路】
    我们作为刚学图论的小蒟蒻,先接触到的算法一定是图上最短路径算法。而最短路算法中最简单的当属Floyd-Warshall算法。下面是一些基本介绍:​该算法可以计算图上任意两点间......
  • ACM初学者指南学习心得
    2022年快过完了,上学期有点摆烂,最近刚刚阳过,在家颓废了好几天。昨天看了一部电影《大学》,非常励志。看完电影,深感自己大学以来这一年半过得有点小糟糕,昨天被刺激了一下,今天......
  • ACM预备队-week8(DP2)
    1.疯狂的采药完全背包题目链接:P1616疯狂的采药-洛谷|计算机科学教育新生态(luogu.com.cn)1#include<bits/stdc++.h>2usingnamespacestd;3#defineint......
  • 使用Acme.sh免费签发SSL证书
    github:​​https://github.com/acmesh-official/acme.sh​​ 概述一个纯粹用Shell(Unixshell)语言编写的ACME协议客户端。完整的ACME协议实施。支持ACMEv1和ACMEv2支持......
  • 省选09. 图论
    P2469[SDOI2010]星际竞速可以发现,一个点要么是起点,要么从其它点进入,且每个点最多只会进入一次,出去一次。因此,可以用流量限制每个点被访问一次,用费用计算代价,问题就转化......
  • 数据结构实验之图论六:村村通公路
                                                     数据结构实验之图论六:村村通公路TimeLimit: 1000MSMemory......