Atcoder ABC168 B--D题 题解(B:string的使用, c: 数学三角函数 D:最短路的应用 || 遍历图bfs)&&最短路复习

B - … (Triple Dots)

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

题意:

让你把一个string的长度变为小于k。大于部分用省略号。

总结

  1. string 里的 s.substr(地址,长度)。
    此函数功能是取子串。

AC

#include <iostream>
#include <string>
using namespace std;
int main()
{
    int k;
    cin>>k;
    string s,t;
    cin>>s;
    int len=s.size();
    if(len>k)
    {
        s=s.substr(0,k);
        t="...";
        s+=t;
        cout<<s<<endl;
    }
    else cout<<s<<endl;
    return 0;
}

C - : (Colon)

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

思路:

给你一个时间,要你求时针和分针的角度。
三角函数余弦定理去求即可。

反思:

没有考虑到分针对时针的影响。

AC

#include <iostream>
#include <cmath>
#include <cstdio>
using namespace std;
const double pi=acos(-1.0);
int main()
{
    double a,b;
    double h,m;
    cin>>a>>b>>h>>m;
    h=h+m/60.0;
    m=m/5.0;
    double num=fabs(h-m);
    if(num>6.0)num=12.0-num;
   // cout<<num<<endl;
    double angle=num/12.0*360*pi/180.0;
    //cout<<angle<<endl;
    //cout<<cos(angle)<<endl;
    double dis=a*a+b*b-2*a*b*cos(angle);
    printf("%.9f\n",sqrt(dis));
    return 0;
}

D - … (Double Dots)

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

思路:

给你一个无向图,要你找到进行标记,使得从任意一点,都可以到1号点。
用 sign【】标记上一个位置即可。
下面介绍两种方法

  1. dij的话,直接反向跑最短路。
  2. 可以直接遍历图。bfs//由于是跑bfs所以更新一次就是最短了(边权为1)

AC(dij)

#include <iostream>
#include <cstring>
#include <cstdio>
#include <queue>
#include <algorithm>
#define mp make_pair
#define fi first
#define se second
#define fzhead EDGE(int _to, int _val, int _next)
#define fzbody to(_to), val(_val), next(_next)
#define mst(x,a) memset(x,a,sizeof(x))
#define For(i,x,y) for( int i=(x); i<=(y); i++)
using namespace std;
const int maxm=2e5+10;
const int maxn=1e5+10;
const int INF=0x3f3f3f3f;
typedef pair<int,int>pa;
struct EDGE
{
    int to,val,next;
    EDGE(){}
    fzhead:fzbody{}
}e[maxm<<1];
int cnt,head[maxn],vis[maxn];
int n,m;
int dis[maxn],sign[maxn];
void add(int bg, int to, int val)
{
    e[++cnt]=EDGE(to,val,head[bg]);
    head[bg]=cnt;
}
void dij(int s)
{
    For(i,1,n)vis[i]=0;
    priority_queue<pa>q;
    dis[s]=0;q.push(mp(0,s));
    while(!q.empty())
    {
        int u=q.top().se;
        q.pop();
        if(vis[u])continue;
        vis[u]=1;
        for(int i=head[u]; i!=-1; i=e[i].next)
        {
            if(dis[e[i].to]>dis[u]+e[i].val)
            {
                dis[e[i].to]=dis[u]+e[i].val;
                sign[e[i].to]=u;
                q.push(mp(-dis[e[i].to],e[i].to));
            }
        }
    }
}
int main()
{
    mst(dis,0x3f);mst(head,-1);
    scanf("%d%d", &n,&m);
    For(i,1,m)
    {
        int a,b;
        scanf("%d%d", &a,&b);
        add(a,b,1);add(b,a,1);
    }
    dij(1);
    int flag=1;
    For(i,2,n)if(dis[i]==0x3f3f3f3f){flag=0;break;}
    if(flag)
    {
        cout<<"Yes"<<endl;
        For(i,2,n)cout<<sign[i]<<endl;
    }
    else cout<<"No"<<endl;
    return 0;
}
/*
spfa
    queue<int>q;
    dis[s]=0;
    q.push(1);
    while(!q.empty())
    {
        int u=q.front();q.pop();
        for(int i=head[u]; i!=-1; i=e[i],next)
        {
            int v=e[i].to,w=e[i].val;
            if(dis[v]>dis[u]+w)
            {
                dis[v]=dis[u]+w;
                q.push(v);
                vis[v]++;
                if(vis[v])
            }
        }
    }
*/

AC(BFS)

#include <iostream>
#include <cstring>
#include <cstdio>
#include <queue>
#include <algorithm>
#define mp make_pair
#define fi first
#define se second
#define fzhead EDGE(int _to, int _val, int _next)
#define fzbody to(_to), val(_val), next(_next)
#define mst(x,a) memset(x,a,sizeof(x))
#define For(i,x,y) for( int i=(x); i<=(y); i++)
using namespace std;
const int maxm=2e5+10;
const int maxn=1e5+10;
const int INF=0x3f3f3f3f;
typedef pair<int,int>pa;
struct EDGE
{
    int to,val,next;
    EDGE(){}
    fzhead:fzbody{}
}e[maxm<<1];
int cnt,head[maxn],vis[maxn];
int n,m;
int sign[maxn];
void add(int bg, int to, int val)
{
    e[++cnt]=EDGE(to,val,head[bg]);
    head[bg]=cnt;
}
int main()
{
    mst(head,-1);
    scanf("%d%d", &n,&m);
    For(i,1,m)
    {
        int a,b;
        scanf("%d%d", &a,&b);
        add(a,b,1);add(b,a,1);
    }
    queue<int>q;
    q.push(1);
    while(!q.empty())
    {
        int u=q.front();q.pop();
        for(int i=head[u]; i!=-1; i=e[i].next)
        {
            int v=e[i].to;
            if(!sign[v])//由于是跑bfs所以更新一次就是最短了(边权为1)
            {
                sign[v]=u;
                q.push(v);
            }
        }
    }
    cout<<"Yes"<<endl;
    For(i,2,n)cout<<sign[i]<<endl;
    return 0;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章