讨论 / 求题解【196】小天狼星的访问
woshiniba 2008-10-07 02:40:00
点我顶贴 收藏 删除
另加★源代码★,作参考用。
#1 DarkMaster@2008-08-27 01:46:00
回复 删除
这题只要根据题意模拟就可以了,访问过程可以用dfs。

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.

#2 guoshi3@2008-08-27 18:35:00
回复 删除
procedure go(a){

if (a为目的地) then ....

else for a的每个孩子p do{

sum:=sum+s[a,p];

go(p);

sum:=sum+s[a,p];

}

}

#3 entreveur@2008-10-07 02:40:00
回复 删除
楼上的思路精辟:-)!

顺便附上我写丑了的純模拟式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;

#4 清风我已逝@2018-03-25 07:26:40
回复 删除

只得了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;

}

查看更多回复
提交回复