5 1 0 1 1 2 0 2 3 3 1 1 1 4 100 0 1 0 1
2
题意:
有个人想去海边的城市,有的城市临海,有的不临海,给出每个城市和其他城市之间的道路和距离,让你找一条最短的路径到达海边的城市。
题目的范围比较小,数据量不大,完全可以floyd 算法简单解决,不过有个特殊的地方是,每个城市都要事先标记一下,这个城市是否临海,只有在临海的时候才更新最短的路径。
#include<stdio.h>
#include<string.h>
#define min(a,b) (a<b?a:b)
#define inf 0x3f3f3f3f
using namespace std;
int map[205][205],n,m;
bool x[105];
void floyd()
{
for(int k=0;k<n;++k)
{
for(int i=0;i<n;++i)
{
for(int j=0;j<n;++j)
{
map[i][j]=min(map[i][j],map[i][k]+map[k][j]);
}
}
}
}
int main()
{
//freopen("shuju.txt","r",stdin);
int i,j;
while(~scanf("%d",&n))
{
memset(map,inf,sizeof(map));
memset(x,0,sizeof(x));
for(i=0,j=0;i<n;++i,++j)
{
map[i][j]=0;//自身到自身距离 0
}
int a,b;
for(i=0;i<n;++i)
{
scanf("%d%d",&m,&x[i]);//注意输入的格式,标记状态
for(j=0;j<m;++j)
{
scanf("%d%d",&a,&b);
map[i][a]=b;
}
}
floyd();
int minn=inf;
for(i=0;i<n;++i)
{
if(x[i])//临海的城市才更新最值
{
minn=min(minn,map[0][i]);
}
}
printf("%d\n",minn);//找到输出.
}
return 0;
}