单源最短路的建图方式

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;
}
相关推荐
小月球~5 小时前
天梯赛 · 并查集
数据结构·算法
仍然.5 小时前
算法题目---模拟
java·javascript·算法
史蒂芬_丁6 小时前
Qt, C++数据类型扩展问题
数据库·c++·qt
6Hzlia6 小时前
【Hot 100 刷题计划】 LeetCode 118. 杨辉三角 | C++ 动态规划题解
c++·leetcode·动态规划
三道渊7 小时前
C语言:文件I/O
c语言·开发语言·数据结构·c++
潇冉沐晴7 小时前
DP——背包DP
算法·背包dp
是有头发的程序猿8 小时前
用Open Claw接口做1688选品、价格监控、货源对比
开发语言·c++·人工智能
GIOTTO情8 小时前
2026 世界互联网大会亚太峰会|AI 时代媒介投放的技术实战与算法优化
人工智能·算法
逆境不可逃8 小时前
LeetCode 热题 100 之 543. 二叉树的直径 102. 二叉树的层序遍历 108. 将有序数组转换为二叉搜索树 98. 验证二叉搜索树
算法·leetcode·职场和发展
计算机安禾8 小时前
【数据结构与算法】第19篇:树与二叉树的基础概念
c语言·开发语言·数据结构·c++·算法·visual studio code·visual studio