首页 > 其他分享 >CF1106D Lunar New Year and a Wander 题解

CF1106D Lunar New Year and a Wander 题解

时间:2023-09-24 23:25:08浏览次数:33  
标签:CF1106D int 题解 texttt head tot vis Lunar dis

CF1106D 题解

暑期学校军训第一天模拟赛的题,相对而言比较简单

题意:

题意其实很简单,就是有一个无向图,需要你从\(1\)号节点出发,然后一次遍历所有的点,输出其中字典序最小的遍历

思路

说说思路吧,这题既然要遍历图上所有点,那首先就会想到 \(\texttt{BFS}\) 或 \(\texttt{DFS}\),可本题还要求要字典序小,这两种方法要把所有情况都遍历一遍才能求出最值,这样显然会 \(\texttt{TLE}\)。那我们再想,这题要求字典序最小的遍历方法,那我们就利就用贪心思想,每次选编号最小的节点去走,这样结果肯定是最优的。

然后这道题就很简单了,一个 \(\texttt{DFS}\) 用优先队列维护一下就做完了~

这里还有一个知识点是链式前向星,就是存图加边的一个算是小模板的小小小函数

void add(int u,int v){
	tot++;
    a[tot].next=head[u];
    a[tot].to=v ;
    head[u]=tot;
}

这个 \(\texttt{DFS}\) 其实我感觉和 \(\texttt{SPFA}\) 里面的代码很像,不知道为什么

不信给你们看看

#include<bits/stdc++.h>
using namespace std;
const int N=1e5+100;
const int INF=0x3f3f3f3f;
struct node{
    int e,w;
};
int n,m,x,y,z;
int dis[N],vis[N];
vector<node> a[N];
queue<int> q;
void spfa(){
    q.push(1);
    vis[1]=1;
    memset(dis,INF,sizeof(dis));
    dis[1]=0;
    while(!q.empty()){
        int u=q.front();
        q.pop();
        vis[u]=0;
        for(int i=0;i<a[u].size();i++){
            int e=a[u][i].e;
            int w=a[u][i].w;
            if(dis[e]>dis[u]+w){
                dis[e]=dis[u]+w;
                if(vis[e]==0){
                    vis[e]=1;
                    q.push(e);
                }
            }
        }
    }
}
int main(){
    cin>>n>>m;
    for(int i=1;i<=m;i++){
        cin>>x>>y>>z;
        a[x].push_back({y,z});
        a[y].push_back({x,z});
    }
    spfa();
    cout<<dis[n];
    return 0;
}
//给定M条边,N个点的带权无向图。求1到N的最短路。 

你看是不是很像

好了,还是看看这道题的代码吧

#include<bits/stdc++.h>
using namespace std;
const int N=1e5+100;
int n,m;
struct edge{
    int to,next;
}a[N<<1];
priority_queue<int,vector<int>,greater<int> >q;
int head[N],vis[N],tot;
void add(int u,int v){
	tot++;
    a[tot].next=head[u];
    a[tot].to=v ;
    head[u]=tot;
}
void dfs(){
    q.push(1);
    vis[1]=1;
    while(!q.empty()){
        int u=q.top();
        q.pop() ;
        printf("%d ",u);
        for(int i=head[u];i;i=a[i].next){
            int v=a[i].to;
            if(!vis[v]){
            	vis[v]=1;
            	q.push(v);
			}
        }
    }
}
int main(){
    scanf("%d%d",&n,&m);
    for(int i=1;i<=m;i++){
    	int x,y;
    	scanf("%d%d",&x,&y);
        add(x,y);
        add(y,x);
    }
    dfs();
    return 0 ;
}

总而言之,这道题就是图的遍历,我觉得这道题甚至都不可以放在绿题里面,黄题差不多了

标签:CF1106D,int,题解,texttt,head,tot,vis,Lunar,dis
From: https://www.cnblogs.com/xuantianhao/p/17726921.html

相关文章

  • ciscn_2019_c_1 题解
    main函数如下:int__cdeclmain(intargc,constchar**argv,constchar**envp){intv4;//[rsp+Ch][rbp-4h]BYREFinit(argc,argv,envp);puts("EEEEEEEhhiii");puts("EEmmmmmmm......
  • [JOISC 2014] 電圧 题解
    [JOISC2014]電圧题解赛时都想到了我也不知道为啥自己没敢写首先题意可以转化为,我们去掉一个边后,剩下的图可以黑白染色,同时保证去掉的边两端的点颜色相同,问这样的边数。换句话说,去掉一条边后,剩下的图应该是一个二分图。然后我们很容易想到线段树分治来处理这种问题。每次只有......
  • 题解
    题目大意有\(n\)个杯子,第\(i\)个杯子里装有\(W_i\)升水,且有\(n\)对正整数\(l_i,r_i\)。Yuri和Muri两人在玩一个游戏:两人轮流进行操作,最先不能进行操作者输。一次操作定义为:操作者选择一个杯子\(i\),从中喝掉\(x_i\)升水。对于两个人,都要满足\(x_i\in[l_i,\min(r_......
  • 【POJ 3253】Fence Repair 题解(贪心算法+优先队列+哈夫曼树)
    农夫约翰想修理牧场周围的一小段围栏。他测量了围栏,发现他需要N(1≤N≤20000)块木板,每块木板都有一定的整数长度Li(1≤Li≤50000)单位。然后,他购买了一块长度刚好足以锯入N块木板的长木板(即,其长度为Li长度的总和)。FJ忽略了“切口”,即锯切时锯屑损失的额外长度;你也应该忽略它。FJ伤心地......
  • S16.23.12.2. 集合论 题解
    原题连接可以发现集合对称差就是异或运算。每个点都记一个长度为值域的bitset,每一位都表示根到他有没有奇数个这个数字。那么\(a_x\)改为\(v\)的修改就变成了修改子树的所有点的bitset,每次将子树中所有点的第\(a_x\)位取反,再将第\(v\)位取反。查询就是\(u\)的\(b......
  • springBoot上传文件时MultipartFile报空问题解决方法
    1.问题描述:之前用springMVC,转成springboot之后发现上传不能用。网上参考说是springboot已经有CommonsMultipartResolver了,但是我的上传后台接收的还是null。2.解决方法加入配置类importorg.springframework.context.annotation.Bean;importorg.springframework.context......
  • AT_abc321_f [ABC321F] #(subset sum = K) with Add and Erase 题解
    AT_abc321_f[ABC321F]#(subsetsum=K)withAddandErase题解题目大意现在有一个空箱子。给你两个数\(Q,K\),然后给你\(Q\)行,每一行代表一个操作:\(+x\),即向箱子里加一个权值为\(x\)的小球。\(-x\),即从箱子里把权值为\(x\)的小球拿一个出来。保证合法,即箱子......
  • CF877F 题解
    CF877F题解更好的阅读体验提供一个扫描线+根号分治做法。首先,可以把题目的条件转化成求$sum_r-sum_{l-1}=k$的区间数。考虑扫描线,当区间的右端点从$r-1$移动到$r$时,新增的区间的左端点就是所有满足$sum_{l-1}=sum_r-k,l\ler$的$l$。这时我们对$sum_{l-1}$......
  • 【问题解决】shell脚本执行错误 $‘\r‘:command not found
    问题原因:在Windows中,换行符是由回车符(\r)和换行符(\n)组成的,而在Unix/Linux等系统中,只使用换行符(\n)作为换行标志。当你在Unix/Linux系统上运行一个包含Windows格式换行符的脚本时,Shell会尝试解释其中的回车符,导致错误提示$‘\r’:commandnotfound。这是因为Shell将回......
  • [COCI2016-2017#4] Osmosmjerka 题解
    [COCI2016-2017#4]Osmosmjerka题解我们发现对于每个点,只有八个方向,也就是说,最终能得到的字符串只会有\(8nm\)个,那我们可以考虑把这些字符串的哈希值求出来,相同的哈希值代表选到相同字符串的一种可能,直接统计即可。现在的问题就在于,怎么快速地求出这\(8nm\)个字符串的哈希......