最短路算法裸题。
题意:翻译来自scy
MPI Maelstrom (Message Passing Interface )
n台电脑,要实现广播信息。每一台电脑能同时传播信息给所有与它相邻的电脑。
给出连接矩阵的下三角,'x'表示无法直接连接。
要求实现广播的最短时间。
从第一台电脑开始广播。
Sample Input
5 表示5个点
50 表示map[2][1]=50
30 5 表示 map[3][1]=30,map[3][2]=5
100 20 50 表示 map[4][1]=100 .......
10 x x 10 ........
Sample Output
35
以下是代码用的是floyd算法。同时学会atoi()的用法,用于将字符串转换为数。
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<iostream>
using namespace std;
const int N=110,INF=(int)1e5;
char s[20];
int n;
int d[N][N];
void floyd()
{
int i,j,k;
for(k=1;k<=n;k++)
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
d[i][j]=min(d[i][j],d[i][k]+d[k][j]);
int mx=-1;
for(i=2;i<=n;i++)
if(d[1][i]<INF) mx=max(mx,d[1][i]);
printf("%d\n",mx);
}
int main()
{
int i,j;
while(scanf("%d",&n)!=EOF)
{
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
if(i==j) d[i][j]=0;
else d[i][j]=INF;
for(i=2;i<=n;i++)
for(j=1;j<i;j++)
{
scanf("%s",s);
if(s[0]!='x')
{
int t=atoi(s);
d[i][j]=d[j][i]=t;
}
}
floyd();
}
return 0;
}
也可用SPFA:
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<queue>
#include<iostream>
using namespace std;
const int N=110,INF=(int)1e6;
int n,len;
char s[30];
int first[N],vis[N],d[N];
struct node{
int x,y,d,next;
}a[N*N];
void ins(int x,int y,int d)
{
len++;
a[len].x=x;a[len].y=y;a[len].d=d;
a[len].next=first[x];first[x]=len;
}
int main()
{
int i,j;
while(scanf("%d",&n)!=EOF)
{
len=0;
memset(first,0,sizeof(first));
for(i=2;i<=n;i++)
{
for(j=1;j<i;j++)
{
scanf("%s",s);
if(s[0]!='x')
{
int t=atoi(s);
ins(i,j,t);
ins(j,i,t);
}
}
}
d[1]=0;
for(i=2;i<=n;i++) d[i]=INF;
memset(vis,0,sizeof(vis));
queue<int> q;
q.push(1);
while(!q.empty())
{
int x=q.front();q.pop();
vis[x]=1;
for(i=first[x];i;i=a[i].next)
{
int y=a[i].y;
if(d[x]+a[i].d<d[y])
{
d[y]=d[x]+a[i].d;
if(!vis[y])
{
vis[y]=1;
q.push(y);
}
}
}
vis[x]=0;
}
int mx=-1;
for(i=1;i<=n;i++) mx=max(d[i],mx);
printf("%d\n",mx);
}
}