const maxn=101;
var
g:array[0..maxn,0..maxn] of double;
i,j,n,p,s,t,l:smallint;
vis:array[0..maxn] of boolean;
time:double;
function getmin(x:smallint):smallint;
var
i,s:smallint;
min:double;
begin
min:=1e100; s:=n+1;
for i:=0 to n do if (i<>x)and(not vis[i])and(g[x,i]<min) then begin s:=i; min:=g[x,i]; end;
getmin:=s;
end;
procedure dfs(dep:smallint);
var i:smallint;
begin
if dep=p then begin write(time:0:0); halt; end;
while g[dep,getmin(dep)]<1e99 do begin
i:=getmin(dep); vis[i]:=true; time:=time+g[dep,i];
dfs(i);
time:=time+g[dep,i];
end;
end;
begin
fillchar(vis,sizeof(vis),0);
readln(n,p);
for i:=0 to maxn do for j:=0 to maxn do if i=j then g[i,j]:=0 else g[i,j]:=1e100;
for i:=1 to n-1 do begin
read(s,t,l);
g[s,t]:=l;
g[t,s]:=l;
end;
time:=0;
vis[0]:=true;
dfs(0);
end.
if (a为目的地) then ....
else for a的每个孩子p do{
sum:=sum+s[a,p];
go(p);
sum:=sum+s[a,p];
}
}
顺便附上我写丑了的純模拟式DFS,呃...
procedure dfsfind(i:longint; subd:int64);
var k,j,next,mind:longint;
begin
mind:=maxlongint div 2;
for j:=0 to n do
if(not vis[j])and(dist[i,j]<mind)then
begin
mind:=dist[i,j];
next:=j;
end;
if mind<>maxlongint div 2 then
begin
pre[next]:=i;
if(next=target)then
begin
ans:=subd+mind;
exit;
end;
vis[next]:=true;
dfsfind(next,subd+mind);
vis[next]:=false;
end
else
if mind=maxlongint div 2 then //go back
begin
vis[i]:=true;
dfsfind(pre[i],subd+dist[i,pre[i]]);
end;
end;
只得了90分,WA了一个点
求指教
#include<bits/stdc++.h>
using namespace std;
int dis[205][205],n,p,ans,vis[205];
struct node{
int dis,i;
};
struct Node{
node a[105];
int tot;
}ax[105];
bool cmp(node A,node B){
return A.dis>B.dis;
}
void dfs(int x){
vis[x]=1;
if(x==p) {cout<<ans;exit(0);}
int tp=ax[x].tot;
for(int i=tp;i>=1;i--){
int ttp=ax[x].a[i].i;
if(vis[ttp]==0){
vis[ttp]=1;
ans+=ax[x].a[i].dis;
dfs(ttp);
ans+=ax[x].a[i].dis;
vis[ttp]=0;
ax[x].tot--;
}
}
}
int main()
{
cin>>n>>p;
for(int i=1;i<n;i++){
int u,v,w;
cin>>u>>v>>w;
dis[u][v]=w;dis[v][u]=w;
}
for(int i=0;i<n;i++)
for(int j=0;j<n;j++){
if(dis[i][j]!=0){
int tp=++ax[i].tot;
ax[i].a[tp].dis=dis[i][j];ax[i].a[tp].i=j;
}
}
for(int i=0;i<n;i++)
sort(ax[i].a+1,ax[i].a+1+ax[i].tot,cmp);
dfs(0);
return 0;
}