为什么我老范一些“高级”错误啊
灾后重建输出没写调了半天
P1119 灾后重建
样例:
4 5
1 2 3 4
0 2 1
2 3 1
3 1 2
2 1 4
0 3 5
4
2 0 2
0 1 2
0 1 3
0 1 4
第1天:
第2天:
第3天:
第4天:
每次有新的可经过的点,就以新的可经过的点为中转单进行floyd
void floyd(int k)
{
for(int i = 1;i < n;i ++)
{
for(int j = i + 1;j <= n;j ++)
{
dp[j][i] = dp[i][j] = min(dp[i][j],dp[i][k] + dp[k][j]);
}
}
}
P1364 医院设置
这道题我们可以对每个点进行dijkstra,再把每个点离他的距离*这个点的人数就是在这个点建医院所有居民所走的路程之和,取最小值即可。
void dijkstra(int s)
{
memset(dis,0x3f,sizeof(dis));
memset(f,false,sizeof(f));
dis[s] = 0;
for(int i = 1;i <= n;i ++)
{
int minn = 0x3f3f3f3f,x;
for(int j = 1 ; j <= n ; j ++)
{
if(dis[j] < minn && !f[j])
{
minn = dis[j];
x = j;
}
}
f[x] = true;
for(auto j : v[x])
{
dis[j] = min(dis[j],dis[x] + 1);
}
}
int sum = 0;
for(int i = 1;i <= n;i ++)
{
sum += w[i] * dis[i];
}
minn = min(minn,sum);
}