day56|冗余连接, 冗余连接II

 冗余连接

108. 冗余连接 (kamacoder.com)

#include<vector>
#include<iostream>

using namespace std;
int n = 0;
vector<int> father = vector<int>(1001);
void init(){
    for(int i = 1; i < n + 1; i++){
        father[i] = i;
    }
}
int find(int i){  // 找根节点
    if(i == father[i]){
        return i;
    }
    return father[i] = find(father[i]); // 压缩作用,直接将i链接到根部
}
void join(int i, int j){
    i = find(i);
    j = find(j);
    if(i == j){
        return;
    }
    father[j] = i;
}
bool ifsame(int i, int j){
    i = find(i);
    j = find(j);
    return i == j;
}

int main(){
    cin >> n;
    init();
    for(int i = 0; i < n; i++){
        int u = 0, v = 0;
        cin >> u >> v;
        if(ifsame(u, v)){
            cout << u << " " << v << endl;
        }else{
            join(u, v);   
        }
    }
    return 0;
}

冗余连接II 

109. 冗余连接II (kamacoder.com)

#include<iostream>
#include<vector>

using namespace std;

int n;

vector<int> father = vector<int>(1001);

void init(){
    for(int i = 1; i <= n; i++){
        father[i] = i;
    }
}

int find(int i){
    if(i == father[i]){
        return i;
    }
    return father[i] = find(father[i]);
}

bool same(int i, int j){
    i = find(i);
    j = find(j);
    return i == j;
}

void join(int i, int j){
    i = father[i];
    j = father[j];
    if(i == j){
        return ;
    }
    father[j] = i;
}

bool valid(vector<vector<int>> &edges, int order){
    init();
    for(int i = 0; i < n; i++){
        if(i == order){
            continue;
        }
        if(same(edges[i][0], edges[i][1])){
            return false;
        }
        join(edges[i][0], edges[i][1]);
    }
}
void getRemoved(vector<vector<int>> &edges){
    init();
    for(int i = n - 1; i >= 0; i--){
        if(edges[i][0] == 0){
            continue;
        }
        if(same(edges[i][0], edges[i][1])){
            cout << edges[i][0] << " " << edges[i][1];
            return ;
        }
        join(edges[i][0], edges[i][1]);
    }
}
int main(){
    int s = 0, t = 0;
    cin >> n;
    vector<vector<int>> edges(n, vector<int>(2));
    vector<int> counts(n + 1);
    for(int i = n - 1; i >= 0; i--){
        cin >> s >> t;
        edges[i][0] = s;
        edges[i][1] = t;
        counts[t]++;
    }
    for(int i = 0; i < n; i++){
        if(counts[edges[i][1]] == 2){
            if(valid(edges, i)){
                cout << edges[i][0] << " " << edges[i][1];
                return 0;
            }
        }
    }
    getRemoved(edges);
    return 0;
}

我要实现的功能如下:(1) 能实现24小时、60分、60秒的基本计时功能,格式为08-56-36:时-分-秒;可以通过按键设置定时和调整时间,并通过数码管显示时间; (2) 能实现年月日的日期功能,格式为06-06-22:月-日-年; (3) 时钟具有整点报时功能(当时钟计到59’50时开始报时); (4) 上板复位后从00年1月1号0时0分0秒开始计时; (5) 按键要有防抖功能,用于设置日历和时间,按下按键0进入日期设置状态,再次按下按键0进入时钟设置状态,再次按下按键0退出设置状态; (6) 按键1用来选择想要设置的年月日或时分秒的个位;按键2在设置状态时进行计数设置,每按一次数码管显示数字加1; (7) 闰年:每400年整一闰,或每4年且不为百年的一闰。即能被400整除,或不能被100整除但能被4整除的年份为闰年; (8) 平年365天(52周+1天),闰年366天(52周+2天),其中平年2月28天,闰年2月29天。 由于开发板限制,实际蜂鸣器在开发板上为led闪烁。请说明下面这个模块的代码有没有问题,如果有,请修改:module ymm579( input clk, //CLOCK_50 input reset, //SW0 input clock_calendar, //SW1 //for clock input set_time, //SW2 input set_hour, //SW4 input set_min, //SW3 //for calendar input set_day, //SW17 input set_month, //SW16 input set_year0, //SW12 input set_year1, //SW13 input set_year2, //SW14 input set_year3, //SW15 //output output reg led0,led2, output reg [6:0] hex0,hex1,hex2,hex3,hex4,hex5,hex6,hex7 ); //for clock reg [5:0] hour; reg [5:0] min; reg [5:0] sec; reg [3:0] hr0,hr1,min0,min1,sec0,sec1; //for calendar reg [4:0] day; reg [3:0] month; reg [3:0] year1,year2,year3,year0; reg [3:0] d1,d0,m1,m0; reg [12:0] year; wire clk_1hz; delay(clk,clk_1hz);//generate 1hz clock always@(posedge clk_1hz,posedge reset) begin if(reset==1) begin hour<=0;min<=0;sec<=0;day<=1;month<=1;year0<=2;year1<=1;year2<=0;year3<=2; end else begin if(set_time==0) begin led0<=1;//when we don't set time, led0 will blink sec<=sec+1; if(sec==59) begin sec<=0; min<=min+1; end if(min==59&&sec==59) begin sec<=0; min<=0; hour<=hour+1; end if(hour==23&&min==59&&sec==59) begin sec<=0; min<=0; hour<=0; day<=day+1; end year=year3*1000+year2*100+year1*10+year0; if(day==28&&month==2&&hour==23&&min==59&&sec==59&&(year%4)!=0)//in case of month 2 of a normal year begin month<=3;day<=1;end else if(day==29&&month==2&&hour==23&&min==59&&sec==59&&(year%4)==0)//in case it's a leaf year begin month<=3;day<=1;end else if(day==30&&hour==23&&min==59&&sec==59)//in case of month 4,6,9,11 : we have 30 days begin if(month==4||month==6||month==9||month==11) begin month<=month+1;day<=1;end end else if(day==31&&hour==23&&min==59&&sec==59)//in case of month 1,3,5,7,8,10,12 : we have 30 days begin if(month==1||month==3||month==5||month==7||month==8||month==10||month==12) begin month<=month+1;day<=1;end end end else if(set_time==1) begin led0<=0;//when we set time, led0 will be off if(set_hour==1) begin if(hour==5'd23) hour<=0; else hour<=hour+1; end if(set_min==1) begin if(min==6'd59) min<=0; else min<=min+1; end if(set_day==1) begin if(day==5'd31) //set day day<=1; else day<=day+1; end if(set_month==1) begin if(month==4'd12)//set month month<=1; else month<=month+1; end if(set_year0==1) begin if(year0==4'd9) //set year hang don vi year0<=0; else year0<=year0+1; end if(set_year1==1) begin if(year1==4'd9) //set year hang chuc year1<=0; else year1<=year1+1; end if(set_year2==1) begin if(year2==4'd9) //set year hang tram year2<=0; else year2<=year2+1; end if(set_year3==1) begin if(year3==4'd9) //set year hang ngan year3<=0; else year3<=year3+1; end end end end always@(posedge clk_1hz) begin if(clock_calendar==1)//display clock begin led2<=1;//when we choose to display clock,led2 will blink hex6<=0; hex7<=0; bcd (hour,hr1,hr0);//display hour display (hr0,hex4); display (hr1,hex5); bcd (min,min1,min0);//display min display (min0,hex2); display (min1,hex3); bcd (sec,sec1,sec0);//display sec display (sec0,hex0); display (sec1,hex1); end else if(clock_calendar==0)//display calendar begin led2<=0;//when we choose to display calendar,led2 will be off bcd (day,d1,d0);//display day display (d0,hex6); display (d1,hex7); bcd (month,m1,m0);//display month display (m0,hex4); display (m1,hex5); display (year0,hex0);//display year display (year1,hex1); display (year2,hex2); display (year3,hex3); end end task bcd; input [5:0] bin; output [3:0] bcd1; output [3:0] bcd0; case (bin) 6'd0 : begin bcd1 <= 4'b0000; bcd0 <= 4'b0000; end 6'd1 : begin bcd1 <= 4'b0000; bcd0 <= 4'b0001; end 6'd2 : begin bcd1 <= 4'b0000; bcd0 <= 4'b0010; end 6'd3 : begin bcd1 <= 4'b0000; bcd0 <= 4'b0011; end 6'd4 : begin bcd1 <= 4'b0000; bcd0 <= 4'b0100; end 6'd5 : begin bcd1 <= 4'b0000; bcd0 <= 4'b0101; end 6'd6 : begin bcd1 <= 4'b0000; bcd0 <= 4'b0110; end 6'd7 : begin bcd1 <= 4'b0000; bcd0 <= 4'b0111; end 6'd8 : begin bcd1 <= 4'b0000; bcd0 <= 4'b1000; end 6'd9 : begin bcd1 <= 4'b0000; bcd0 <= 4'b1001; end 6'd10 : begin bcd1 <= 4'b0001; bcd0 <= 4'b0000; end 6'd11 : begin bcd1 <= 4'b0001; bcd0 <= 4'b0001; end 6'd12 : begin bcd1 <= 4'b0001; bcd0 <= 4'b0010; end 6'd13 : begin bcd1 <= 4'b0001; bcd0 <= 4'b0011; end 6'd14 : begin bcd1 <= 4'b0001; bcd0 <= 4'b0100; end 6'd15 : begin bcd1 <= 4'b0001; bcd0 <= 4'b0101; end 6'd16 : begin bcd1 <= 4'b0001; bcd0 <= 4'b0110; end 6'd17 : begin bcd1 <= 4'b0001; bcd0 <= 4'b0111; end 6'd18 : begin bcd1 <= 4'b0001; bcd0 <= 4'b1000; end 6'd19 : begin bcd1 <= 4'b0001; bcd0 <= 4'b1001; end 6'd20 : begin bcd1 <= 4'b0010; bcd0 <= 4'b0000; end 6'd21 : begin bcd1 <= 4'b0010; bcd0 <= 4'b0001; end 6'd22 : begin bcd1 <= 4'b0010; bcd0 <= 4'b0010; end 6'd23 : begin bcd1 <= 4'b0010; bcd0 <= 4'b0011; end 6'd24 : begin bcd1 <= 4'b0010; bcd0 <= 4'b0100; end 6'd25 : begin bcd1 <= 4'b0010; bcd0 <= 4'b0101; end 6'd26 : begin bcd1 <= 4'b0010; bcd0 <= 4'b0110; end 6'd27 : begin bcd1 <= 4'b0010; bcd0 <= 4'b0111; end 6'd28 : begin bcd1 <= 4'b0010; bcd0 <= 4'b1000; end 6'd29 : begin bcd1 <= 4'b0010; bcd0 <= 4'b1001; end 6'd30 : begin bcd1 <= 4'b0011; bcd0 <= 4'b0000; end 6'd31 : begin bcd1 <= 4'b0011; bcd0 <= 4'b0001; end 6'd32 : begin bcd1 <= 4'b0011; bcd0 <= 4'b0010; end 6'd33 : begin bcd1 <= 4'b0011; bcd0 <= 4'b0011; end 6'd34 : begin bcd1 <= 4'b0011; bcd0 <= 4'b0100; end 6'd35 : begin bcd1 <= 4'b0011; bcd0 <= 4'b0101; end 6'd36 : begin bcd1 <= 4'b0011; bcd0 <= 4'b0110; end 6'd37 : begin bcd1 <= 4'b0011; bcd0 <= 4'b0111; end 6'd38 : begin bcd1 <= 4'b0011; bcd0 <= 4'b1000; end 6'd39 : begin bcd1 <= 4'b0011; bcd0 <= 4'b1001; end 6'd40 : begin bcd1 <= 4'b0100; bcd0 <= 4'b0000; end 6'd41 : begin bcd1 <= 4'b0100; bcd0 <= 4'b0001; end 6'd42 : begin bcd1 <= 4'b0100; bcd0 <= 4'b0010; end 6'd43 : begin bcd1 <= 4'b0100; bcd0 <= 4'b0011; end 6'd44 : begin bcd1 <= 4'b0100; bcd0 <= 4'b0100; end 6'd45 : begin bcd1 <= 4'b0100; bcd0 <= 4'b0101; end 6'd46 : begin bcd1 <= 4'b0100; bcd0 <= 4'b0110; end 6'd47 : begin bcd1 <= 4'b0100; bcd0 <= 4'b0111; end 6'd48 : begin bcd1 <= 4'b0100; bcd0 <= 4'b1000; end 6'd49 : begin bcd1 <= 4'b0100; bcd0 <= 4'b1001; end 6'd50 : begin bcd1 <= 4'b0101; bcd0 <= 4'b0000; end 6'd51 : begin bcd1 <= 4'b0101; bcd0 <= 4'b0001; end 6'd52 : begin bcd1 <= 4'b0101; bcd0 <= 4'b0010; end 6'd53 : begin bcd1 <= 4'b0101; bcd0 <= 4'b0011; end 6'd54 : begin bcd1 <= 4'b0101; bcd0 <= 4'b0100; end 6'd55 : begin bcd1 <= 4'b0101; bcd0 <= 4'b0101; end 6'd56 : begin bcd1 <= 4'b0101; bcd0 <= 4'b0110; end 6'd57 : begin bcd1 <= 4'b0101; bcd0 <= 4'b0111; end 6'd58 : begin bcd1 <= 4'b0101; bcd0 <= 4'b1000; end 6'd59 : begin bcd1 <= 4'b0101; bcd0 <= 4'b1001; end 6'd60 : begin bcd1 <= 4'b0110; bcd0 <= 4'b0000; end endcase endtask task display; input [3:0] bcd; output [6:0] seg7; case(bcd) 5'h00: seg7 <= 7'b1000000; 5'h01: seg7 <= 7'b1111001; 5'h02: seg7 <= 7'b0100100; 5'h03: seg7 <= 7'b0110000; 5'h04: seg7 <= 7'b0011001; 5'h05: seg7 <= 7'b0010010; 5'h06: seg7 <= 7'b0000010; 5'h07: seg7 <= 7'b1111000; 5'h08: seg7 <= 7'b0000000; 5'h09: seg7 <= 7'b0010000; endcase endtask endmodule module delay(clk,clk_1hz); input clk; output clk_1hz; reg clk_1hz; integer X; always@(posedge clk) begin if (X==50000000) begin clk_1hz<=1; X<=0; end else begin X<=X+1; clk_1hz<=0; end end endmodule
01-01
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值