首页 > 滴滴9.13 算法编程题
头像
superman2020
编辑于 2020-09-14 11:22
+ 关注

滴滴9.13 算法编程题

第一题:最小生成树
小于k的就建边,其他就是标准的最小生成树。
#include<cstdio>
#include<cstring>
#include<iostream>
using namespace std;
int M[210][210],n,m,k,T,book[210],dist[210];
const int Max= 233333333;

int Prime(int cur)
{
    memset(book,0,sizeof(book));
    book[cur]=1;
    dist[1]=0;
    int Min,sum=0;
    for(int i=2;i<=n;i++)
    {
        dist[i]=M[cur][i];
    }
    for(int i=1;i<n;i++)
    {
        int index, Min=Max;
        for(int j=1;j<=n;j++)
        {
            if(dist[j]<Min&&!book[j])
            {
                Min=dist[j];
                index=j;
            }
        }
        if(Min == Max) return -1;
        book[index]=1;
        sum += Min;
        for(int j=1;j<=n;j++)
        {
            if(!book[j]&&dist[j]>M[index][j])
            {
                dist[j]=M[index][j];
            }
        }
    }
    return sum;
}

int main()
{
    scanf("%d",&T);
    while(T--)
    {

        scanf("%d%d%d",&n,&m,&k);
        for(int i=1;i<=n;i++){
            for(int j=1;j<=n;j++){
                M[i][j] = Max;
            }
        }
        for(int i=0;i<m;i++){
            int a,b,c;scanf("%d%d%d",&a,&b,&c);
            if(c<=k){
                M[a][b] = c;
                M[b][a] = c;
            }
        }
        int sum = Prime(1);
        if(sum!=-1) printf("Yes\n");
        else printf("No\n");
    }
    return 0;
}


第二题:最短路径
注意一下有重复的边,取最小值,注意一下日期2020年2月29天。
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll inf=23333333333;
ll M[1010][1010],visit[1010],dist[1010];
int n,m;
void dijkstra(int s)
{
    memset(visit,0,sizeof(visit));
    for(int i=1;i<=n;i++)
        dist[i]=M[s][i];
    visit[s]=1;
    for(int i=1;i<=n-1;i++){
        int index, minn=inf;
        for(int j=1;j<=n;j++){
            if(visit[j]!=1&&dist[j]<minn){
                index=j;
                minn=dist[j];
            }
        }
        visit[index]=1;
        for(int j=1;j<=n;j++){
            if(visit[j]!=1&&dist[j]> dist[index] + M[index][j])
                dist[j]= dist[index] + M[index][j];
        }
    }
}

int main(){
    while(~scanf("%d %d",&n,&m)){
        for(int i=1;i<=n;i++){
            for(int j=1;j<=n;j++){
                if(i!=j) M[i][j] = inf;
                else M[i][j] = 0;
            }
        }
        for(int i=1;i<=m;i++){
            int a,b,c;
            scanf("%d %d %d",&a,&b,&c);
            M[a][b]=M[b][a]=c;
        }
        int s,e, mon,day,hour;
        scanf("%d%d%d.%d/%d",&s,&e,&mon,&day,&hour);
        dijkstra(s);
        int new_hour = hour + dist[e];
        int add_day = new_hour / 24;
        new_hour = new_hour % 24;
        int new_day = day + add_day;
        int mon_day[] ={0,31,29,31,30,31,30,31,31,30,31,30,31,31,28,31,30};
        int new_mon = mon;
        while(new_day > mon_day[new_mon]){
            new_day = new_day - mon_day[new_mon];
            new_mon = new_mon + 1;
        }
        printf("%d.%d/%d\n", new_mon,new_day,new_hour);
    }
}


全部评论

(0) 回帖
加载中...
话题 回帖

相关热帖

近期热帖

历年真题 真题热练榜 24小时
技术(软件)/信息技术类
查看全部

热门推荐