小P的图论课 (模拟退火)

uses math;
const maxn=105;
      INF=2000000000;
var n,m,i,x,y,sum,ans,delta:longint;
    map:array[0..maxn,0..maxn] of longint;
    flag:array[0..maxn] of boolean;
    T:double;
    ok:boolean;
function ran:double;
begin
    exit(random(12345)/12345);
end;
procedure add(x,y:longint);
begin
    inc(map[x,0]); map[x,map[x,0]]:=y;
end;
begin
    randomize;
    readln(n,m);
    for i:=1 to m do
    begin
        readln(x,y);
        add(x,y);
        add(y,x);
    end;
    fillchar(flag,sizeof(flag),true);
    T:=0.1;
    sum:=n; ans:=INF;
    while T>0.000001 do
    begin
        T:=T*0.999;
        repeat
            x:=random(n)+1;
        until flag[x];
        delta:=-1;
        for i:=1 to map[x,0] do
        begin
            if map[x,i]=x then inc(delta);
            if not flag[map[x,i]] then inc(delta);
        end;
        ok:=false;
        if delta<0 then ok:=true
        else
            if ran<exp(-delta/T) then ok:=true;
        if ok then
        begin
            sum:=sum+delta;
            if sum<ans then ans:=sum;
            flag[x]:=false;
            for i:=1 to map[x,0] do
                flag[map[x,i]]:=true;
        end;
    end;
    writeln(ans);
end.

 

转载于:https://www.cnblogs.com/rpSebastian/p/4378021.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值