首页 > 其他分享 >8.5第四周周一总结

8.5第四周周一总结

时间:2024-08-05 11:18:49浏览次数:10  
标签:总结 8.5 int back vis maxn push dist 四周

1dijkstra堆优化练习

1)邮寄员寄信

题目

多次运用最短路
#include<bits/stdc++.h>
using namespace std;
int n,m;
const int maxn=1e3+10;
struct node{
	int u,w;
	//顺序好像不能错
};
bool vis[maxn];
int dist[maxn];
vector<node> g[maxn];
void dijk(int s)
{
	priority_queue<pair<int,int>,vector<pair<int,int>>,greater<pair<int,int>>>q;
	//注意q是咋写的
	dist[s]=0;

	q.push({0,s});
	while(q.size()!=0)
	{
	
	int u=q.top().second;
	//只取了点,没有q.top.first=w,自己写的逻辑有点问题 
		//注意是top后有括号 
		//优先队列默认按第一个排序,所以pair的first要放权值
		q.pop();
		//用过了这个点松弛所以我们要弹出
		if(vis[u])continue;
		vis[u]=1;
		for(int i=0;i<g[u].size(); i++)
		{
		    //i起始是0 
		
			//用u更新距离 
			int d=g[u][i].w;
			int v=g[u][i].u;
			if(dist[v]>dist[u]+d)
			{
				dist[v]=dist[u]+d;
				q.push({dist[v],v});
				//把和u有关的点放进去
			}
		}

	}
	
}
int main()
{	memset(dist,0x3f,sizeof dist);
	memset(vis,0,sizeof vis);
	long long sum=0;
	cin>>n>>m;
	while(m--)
	{
		int a,b,c;
		cin>>a>>b>>c;
//		g[a].u=b;
//		g[a].w=c;
//这么写会报错
g[a].push_back({b,c});

	}
	dijk(1);
	for(int i=1;i<=n;i++)
	sum+=dist[i];
	

	for(int i=2;i<=n;i++)
	{	
	
	memset(dist,0x3f,sizeof dist);
	memset(vis,0,sizeof vis);
		dijk(i);
		sum+=dist[1];
	}
	cout<<sum<<endl; 
	
 } 

2)最短路(无权值)

代码(以前)
#include <bits/stdc++.h>

using namespace std;
#define int long long
const int mod = 998244353;
#define pii pair<int, int>
const int N = 1e5 + 10;
vector<int> v[N];
int d[N];
void solve()
{
    int n, m, k, Q;
    cin >> n >> m >> k >> Q;

    queue<int> q;
    for (int i = 1; i <= k; i++)
    {
        int x;
        cin >> x;
        d[x] = 1;
        q.push(x);
    }
    while (m--)
    {
        int a, b;
        cin >> a >> b;
        v[a].push_back(b);
        v[b].push_back(a);
    }
    while (q.size())
    {
        auto t = q.front();
        q.pop();

        for (auto j : v[t])
        {
            if (!d[j])
            {
                q.push(j);
                d[j] = d[t] + 1;
            }
        }
    }

    while (Q--)
    {
        int ed;
        cin >> ed;
        cout << d[ed] - 1 << '\n';
    }
}

signed main()
{
    ios::sync_with_stdio(0);
    cin.tie(0);
    cout.tie(0);
    cout << fixed << setprecision(20);
    int t = 1;
    while (t--)
        solve();
}
遍历起点终点会超时re
#include<bits/stdc++.h>
using namespace std;
int n,m,k,q;
const int maxn=1e4+10;
struct node{
	int u,w;
};
bool vis[maxn];
int dist[maxn];
vector<node> g[maxn];
int qd[maxn];
int zd[maxn];
void dijk(int s)
{
	priority_queue<pair<int,int>,vector<pair<int,int>>,greater<pair<int,int>>>q;
	dist[s]=0;

	q.push({0,s});
	while(q.size()!=0)
	{
	
	int u=q.top().second;
	//只取了点,没有q.top.first=w,自己写的逻辑有点问题 
		//注意是top后有括号 
		//优先队列默认按第一个排序,所以pair的first要放权值
		q.pop();
		if(vis[u])continue;
		vis[u]=1;
		for(int i=0;i<g[u].size(); i++)
		{
		    //i起始是0 
		
			//用u更新距离 
			int d=g[u][i].w;
			int v=g[u][i].u;
			if(dist[v]>dist[u]+d)
			{
				dist[v]=dist[u]+d;
				q.push({dist[v],v});
				//记得把他放回去 
			}
		}

	}
	
}
int main()
{	memset(dist,0x3f,sizeof dist);
	memset(vis,0,sizeof vis);
	long long sum=0;
	cin>>n>>m>>k>>q;
	for(int i=0;i<k;i++)
	cin>>qd[i];
	while(m--)
	{
		int a,b;
		cin>>a>>b;
//		g[a].u=b;
//		g[a].w=c;
//这么写会报错
g[a].push_back({b,1});
g[b].push_back({a,1});
//无向图!! 

	}
//	for(int i=0;i<maxn;i++)g[i].push_back({i,0});
		for(int i=0;i<q;i++)
	cin>>zd[i];

for(int i=0;i<q;i++)
{	
int minn=1e9+10;
for(int j=0;j<k;j++)
{
	memset(dist,0x3f,sizeof dist);
	memset(vis,0,sizeof vis);

	dijk(qd[j]);
//	minn=min(minn,dist[i]);
 minn = min(minn, dist[zd[i]]);
 //i不是终点,zd[i]才是。这样还是会re 
}
cout<<minn<<endl; 
	
}
	
 } 
调完
#include<bits/stdc++.h>
using namespace std;
int n,m,k,q;

const int maxn=1e6+10;
int s[maxn];
struct node
{
	int u,w;
};
bool vis[maxn];
int dist[maxn];
vector<node> g[maxn];

void dijk(int s)
{
	priority_queue<pair<int,int>,vector<pair<int,int>>,greater<pair<int,int>>>q;
	for (int i = 0; i <= n; i++)dist[i] = (int)1e18;
	dist[s]=0;

	q.push({0,s});
	while(q.size()!=0)
	{

		int u=q.top().second;
		//只取了点,没有q.top.first=w,自己写的逻辑有点问题
		//注意是top后有括号
		//优先队列默认按第一个排序,所以pair的first要放权值
		q.pop();
		if(vis[u])continue;
		vis[u]=1;
		for(int i=0; i<g[u].size(); i++)
		{
			//i起始是0

			//用u更新距离
			int d=g[u][i].w;
			int v=g[u][i].u;
			if(dist[v]>dist[u]+d)
			{
				dist[v]=dist[u]+d;
				q.push({dist[v],v});
				//记得把他放回去
			}
		}

	}

}
int main()
{
	memset(dist,0x3f,sizeof dist);
	memset(vis,0,sizeof vis);

	cin>>n>>m>>k>>q;
	for (int i = 1; i <= k; i++)cin >> s[i];
	while(m--)
	{
		int a,b;
		cin>>a>>b;
//		g[a].u=b;
//		g[a].w=c;
//这么写会报错
		g[a].push_back({b,1});
		g[b].push_back({a,1});
	}
//  for (int i = 1; i <= m; i++)
//     {
//         int a, b;
//         cin >> a >> b;
//         g[a].push_back({ b,1 });
//         g[b].push_back({ a,1 });
//     }
	for (int i = 1; i <= k; i++)
		g[0].push_back({ s[i],0 });
	dijk(0);
	while (q--)
	{
		int x;
		cin >> x;
		if (dist[x] != (int)1e18)cout << dist[x] << endl;
		else cout << -1 << endl;
	}
}





2 讲课(栈和队列)

课件

标签:总结,8.5,int,back,vis,maxn,push,dist,四周
From: https://www.cnblogs.com/hoshino-/p/18342845

相关文章

  • C++ 指针注意事项总结
    在C++中,指针是一种强大的工具,允许程序员直接访问和操作内存地址。然而,由于指针直接操作内存,错误的使用可能导致程序崩溃、内存泄漏等严重问题。以下是C++指针相关的详细注意事项:1.指针初始化定义指针时务必初始化:未初始化的指针可能指向任意内存地址,称为“野指针”。野指......
  • 2024睿抗国赛赛后总结
    ​题目可以去pta教育超市找写第一题还很清醒。(耗时15分钟)#include<bits/stdc++.h>usingnamespacestd;strings;intsum=0,len=0;intcnt=0;intcheck(charc){ if(c>='a'&&c<='z'){ return1; }elseif(c<='Z'......
  • Python pymodbus类库使用学习总结
    实践环境Python3.9.13https://www.python.org/ftp/python/3.9.13/python-3.9.13-amd64.exepymodbus-3.6.8-py3-none-any.whlhttps://files.pythonhosted.org/packages/35/19/a9d16f74548d6750acf6604fa74c2cd165b5bc955fe021bf5e1fa04acf14/pymodbus-3.6.8-py3-none-any.whl......
  • C#:通用方法总结—第14集
    大家好,今天继续介绍我们的通用方法系列。下面是今天的通用方法:(1)这个通用方法为获取平面矢量///<summary>   ///获取平面矢量   ///</summary>   ///<paramname="c"></param>   ///<returns></returns>   publicstaticdouble[]GetVector(T......
  • 使用Aspire优雅的进行全栈开发——WinUI使用Semantic Kernel调用智普清言LLM总结Asp.N
    前言这算是一篇学习记录博客了,主要是学习语义内核(SemanticKernel)的实践,以及Aspire进行全栈开发的上手体验,我是采用Aspire同时启动API服务,Blazor前端服务以及WinUI的桌面端项目,同时进行三个项目的代码修改,整体感觉很方便,如果代码都修改了只需要启动Aspire项目,不用每个项目单独起......
  • 2024.7.29至2024.8.2周总结
    本周学习任务清单DP优化:单调队列优化、矩阵优化、前缀和优化、线段树优化等ACM模拟赛图论:最小生成树、最短路、欧拉图、强连通分量、缩点、割点、双联通分量。总结本周学习任务不算太大,ACM也让我认识到了如今题目的考察范围和难度,DP优化的基础是暴力DP,我认为这一块是我的......
  • 学Java的第四周
    for循环的执行结果如下:(1)先初始化变量i(inti=1)。(2)然后判断循环条件(i<=100)。(3)如果条件为true,则执行循环体进行累加求和(sum+=i),然后继续执行迭代部分,改变循环变量的值(i++),然后继续判断表达式2,这样就在判断、循环体与迭代部分之间形成循环,直至判断表达式2......
  • 暑假自学Java进度总结04
    一.今日所学:1.下载并使用idea开发工具1>了解idea的发展历史2>尝试用idea编写代码3>学习idea中的项目和模块操作2.学习赋值运算符加后赋值:“+=”减后赋值:“-=”乘后赋值:“*=“除后赋值:“/=”取余后赋值:“%=”3.学习关系运算符1>等于:“==”2>大于:“>”3>小于:“<”4>......
  • 8.1日CSP-J初赛内容总结
    8.1日CSP-J初赛内容总结补充知识点:假设结构体为Point类型structPoint{intx,y;}两种赋值方式PointA;A.x=......;A.y=......;PointA=Point{1,2};整体赋值,将{}里的按先后赋值给x,y小于号重写:优先队列之中booloperator<(const结构体......
  • 8.2日CSP-J初赛内容总结
    8.2日CSP-J初赛内容总结Adobe:PS,PR,......Reader微软:Onedrive(存文件),Excel(表格),Word(文字编辑),Onenote(笔记),PowerPoint(PPT)位号从正数部分最低位开始编号,0到更大的数字。位号从左往右的小数部分从\(-1\)开始编号,编号变小基数:进制的进位数字位权:基数的位号次幂......