您的位置:首页 > 其它

zzuoj 10408 最短路(dijistla||贝尔曼福特 求最少转站点)

2015-10-08 20:23 411 查看
题目大意:求从1到n的最少需要转车的次数,(m,n)代表m条路线,n个点(每个点是有方向的).

其余m行代表每辆车所经过的车站编号.求最少的从1到n的转车次数,若不能到达输出NO

思路:首先要处理输入,用字符串输入,并且注意位数>=2的车站编号的处理,将Map[][]中的所有关联的道路全部赋值为1

,整道题的思路是将点与点之间能够缩短的距离缩短后,直接1到n的最短距离输出-1.单源指的是从1到其他点

迪杰斯塔拉:

#include <iostream>
#include <algorithm>
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <map>
#define inf 0x3f3f3f3f
#define Max 20010
using namespace std;
int Map[600][600],dis[600],n;
char s[2000];
int arr[600];
bool vis[600];
void d()
{
int i,j,k;
for(i=1; i<=n; i++)
{
dis[i]=Map[1][i];
}
vis[1]=true;
int ma,po;
for(i=1; i<n; i++)
{
ma=inf;
po=-1;
for(j=1; j<=n; j++)
{
if(dis[j]<ma&&!vis[j])
{
ma=dis[j];
po=j;
}
}
vis[po]=true;
for(j=1; j<=n; j++)
{
if(!vis[j]&&dis[j]>Map[po][j]+dis[po])
{
dis[j]=Map[po][j]+dis[po];
}
}
}
}
int main()
{
int m,i,j,k,z;
int cla;
scanf("%d",&cla);
while(cla--)
{
memset(vis,false,sizeof(vis));
for(i=1; i<=502; i++)
{
for(j=1; j<=502; j++)
{
if(i!=j)
Map[i][j]=inf;
else
Map[i][j]=0;
}
}
scanf("%d %d",&m,&n);
getchar();
for(i=1; i<=m; i++)
{
z=0;
gets(s);
int l=strlen(s);
for(j=0; j<l; j++)
{
if(s[j]!=' ')
{
int tmp=0;
while(s[j]!=' '&&j<l)
{
tmp=tmp*10+(s[j]-'0');
j++;
}
arr[z++]=tmp;
}
}
for(j=0; j<z-1; j++)
for(k=j+1; k<z; k++)
Map[arr[j]][arr[k] ]=1;
}
d();
if(dis
!=0)
printf("%d\n",dis
-1);
else
printf("NO\n");
}
return  0;
}

贝尔曼福特:

<pre name="code" class="cpp">#include <iostream>
#include <algorithm>
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <map>
#define inf 0x3f3f3f3f
#define Max 20010
using namespace std;
struct node
{
int v,u,w;
}q[1000];

int Map[600][600],dis[600],n,cnt;
char s[2000];
int arr[600];

void add(int u,int v)
{
q[cnt].u=u;
q[cnt].v=v;
q[cnt++].w=1;
}
void BF()
{
int i,j,k;
memset(dis,inf,sizeof(dis));
dis[1]=0;
for(i=0;i<n-1;i++)
{
for(j=0;j<cnt;j++)
{
if(dis[q[j].v ]>dis[q[j].u]+q[j].w )
dis[q[j].v ]=dis[q[j].u ]+q[j].w;
}
}
}

int main()
{
int m,i,j,k,z;
int cla;
scanf("%d",&cla);
while(cla--)
{
cnt=0;
// memset(vis,false,sizeof(vis));
scanf("%d %d",&m,&n);
getchar();
for(i=1; i<=m; i++)
{
z=0;
gets(s);
int l=strlen(s);
for(j=0; j<l; j++)
{
if(s[j]!=' ')
{
int tmp=0;
while(s[j]!=' '&&j<l)
{
tmp=tmp*10+(s[j]-'0');
j++;
}
arr[z++]=tmp;
}
}
for(j=0; j<z-1; j++)
for(k=j+1; k<z; k++)
add(arr[j],arr[k]);
}
BF();
if(dis
!=inf)
printf("%d\n",dis
-1);
else
printf("NO\n");
}
return  0;
}



                                            
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  最短路