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;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章