您的位置:首页 > 其它

1010

2016-06-29 08:00 190 查看
题目编号;1010

题目大意:一个人回家,从办公室穿过一个森林,森令有很多路,要求每次走到一个新的节点他离家的距离更近,求他可以走的路的条数。

解题思路:这题不是很简单,根据题意可以分析是分两阶段来求解的问题。首先用dijkstra算法求出最短的距离,然后根据搜索里面的方法求出路的条数。一开始还是和以前一样,结构体,排序等等,不过这次的算法是讲优先队列的元素加入,由于是排序好的,所以取的路的距离一定是最短的,节约了时间。而后利用一个深搜的函数,求出条数即可。

感想:我就想快点结束ACM好好复习。#include<iostream>
#include<queue>
using namespace std;
struct node
{
int distens,flog;
};
node N[1005];
int map[1005][1005],k;
int direct[1005];
void set(int n)
{
int i,j,m,n1,n2,d;
for(i=1;i<=n;i++)
{
for(j=1;j<=n;j++)
{
map[i][j]=-1;
}
N[i].distens=10000000;N[i].flog=0;direct[i]=0;
}

scanf("%d",&m);
while(m--)
{
cin>>n1>>n2>>d;
if(map[n1][n2]!=0||map[n1][n2]>d)
map[n1][n2]=map[n2][n1]=d;
}
}
void YJY(int n)
{
queue <int>Q;
int now;
int i;
N[2].distens=0;N[2].flog=1;
Q.push(2);
while(!Q.empty())
{
now=Q.front();
Q.pop();
N[now].flog=0;
for(i=1;i<=n;i++)
if(map[now][i]!=-1)
{
if(N[i].distens>N[now].distens+map[now][i])
{
N[i].distens=N[now].distens+map[now][i];
if(N[i].flog==0)
{
N[i].flog=1;
Q.push(i);
}
}
}
}
}
int DFS(int now,int n)
{
int i;
if(direct[now]>0)
return direct[now];
if(now==2)
{
return 1;
}
for(i=1;i<=n;i++)
if(map[now][i]!=-1&&N[now].distens>N[i].distens)
{
direct[now]+=DFS(i,n);
}

return direct[now];
}
int main()
{
int n;
while(cin>>n&&n)
{
set(n);
YJY(n);
k=DFS(1,n);
cout<<k<<endl;
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: