单源最短路的建图方式

1.https://www.acwing.com/problem/content/922/

考虑对每一个线路内部互相连权值为1的边再跑个单源点最短路即可。这里权值都是1,跑个BFS即可

AC代码:

cpp 复制代码
#include<bits/stdc++.h>
using namespace std;
int m,n;
bool g[510][510];
int dis[510];
int stop[510];
void bfs(){
	 memset(dis, 0x3f, sizeof dis);
	 queue<int> q;
	 dis[1]=0;
	 q.push(1);
	 while(!q.empty()){
	 	int ck=q.front();
	 	q.pop();
	 	for(int i=1;i<=n;i++){
	 		if(g[ck][i]&&dis[i]>dis[ck]+1){
	 			dis[i]=dis[ck]+1;
	 			q.push(i);
			 }
		 }
	 }
}
int main(){
	cin>>m>>n;
	string line;
	getline(cin,line);//过滤回车
	while(m--){
		getline(cin, line);
		stringstream ssin(line);
		int cnt=0,p;
		while(ssin>>p) stop[++cnt]=p;
		for(int i=1;i<=cnt;i++){
			for(int j=i+1;j<=cnt;j++){
				g[stop[i]][stop[j]]=1;
			}
		}
	}
	bfs();
	
    if (dis[n] == 0x3f3f3f3f) puts("NO");
    else cout << max(dis[n] - 1, 0) << endl; 
}

2.https://www.acwing.com/problem/content/905/

我们考虑每一个物品当作点,用另一件替换它另需的花费作为有权边,再建立一个超级源点与每一个点相连表示直接购买的花费,于是我们从他跑到1即可。

注意等级差距限制的调件,由于1一定满足,我们直接暴力枚举以他为右端点到以他为左端点的一系列区间即可。

AC代码:

cpp 复制代码
#include<bits/stdc++.h>
using namespace std;
int m,n;
int p[110],l1[110],x;
struct node{
    int dian,w;
};
vector<node> edge[111];
int dis[210];
int st[110];
int spfa(int l,int r)
{
    queue<int> q;
    memset(dis, 0x3f, sizeof dis);
    memset(st,0,sizeof(st));
    dis[0] = 0;
    st[0] = true;
    q.push(0);
  //  if(l[1]<=r&&l[1]>=l) dis[0]=0;
    while (!q.empty())
    {
        int t =q.front();
        q.pop();
        st[t] = 0;
        for (int i = 0; i <edge[t].size(); i++)
        {
            int j = edge[t][i].dian;
            if ((dis[j]>dis[t]+edge[t][i].w)&&(l1[j]<=r&&l1[j]>=l))
            {
                dis[j] = dis[t] + edge[t][i].w;
                if (!st[j])  
                {
                    q.push(j);
                    st[j] = true;
                }
            }
        }
    }
    return dis[1];
}

int main(){
    cin>>m>>n;
    for(int i=1;i<=n;i++){
        cin>>p[i]>>l1[i]>>x;
        edge[0].push_back({i,p[i]});
        for(int j=1;j<=x;j++){
            int t,v;
            cin>>t>>v;
            edge[t].push_back({i,v});
        }
    }
    l1[0]=l1[1];
    int res=1e9;
    for(int i=l1[1]-m;i<=l1[1];i++){
        res=min(res,spfa(i,i+m));
    }
    cout<<res;
}
相关推荐
星恒随风20 分钟前
C++ 类和对象入门(五):初始化列表、explicit 和 static 成员详解
开发语言·c++·笔记·学习·状态模式
浪客灿心1 小时前
项目篇:模块设计与实现
数据库·c++
牛油果子哥q1 小时前
【C++ STL vector】C++ STL vector 终极精讲:动态数组底层原理、两倍扩容机制、迭代器失效、增删查改、性能剖析与工程避坑指南
开发语言·c++
happymaker06262 小时前
LeetCodeHot100——42.接雨水
算法
阿正的梦工坊3 小时前
【Rust】07-错误处理:Option、Result 与 ? 运算符
开发语言·算法·rust
为何创造硅基生物3 小时前
独占指针的创建std::make_unique 本身自带堆出现
c++
kyle~3 小时前
ROS 2 与 Isaac Sim 联合仿真(一)体系架构、环境选型与基础通信闭环
c++·机器人·nvidia·仿真·ros2
努力努力再努力wz4 小时前
【内存管理与高并发内存池系列】从 mmap 到 malloc:文件映射、匿名映射与 glibc 内存分配机制详解
linux·c语言·数据结构·数据库·c++·qt·链表
八解毒剂4 小时前
数据结构-平衡二叉树——对二叉搜索树的优化
数据结构·c++·算法
运行时记录4 小时前
别再手动写提示词了 — SkillOpt 让技能文档自己进化
算法