1、
数据结构实验之图论七:驴友计划
#include <iostream>
#include <cstdlib>
#include <cstdio>
#include <string.h>
#define inf 0x3f3f3f3f
#define MAXN 550
using namespace std;
int ma[MAXN][MAXN];
int mo[MAXN][MAXN];
int n, m;
void Floyd(int s, int d)
{
for( int k = s; k <= d; k++)
{
for( int i = s; i <= d; i++)
{
for( int j = s; j <= d; j++)
{
if((ma[i][j] > ma[i][k] + ma[k][j]) ||
(ma[i][j] == ma[i][k] + ma[k][j] &&
mo[i][j] > mo[i][k] + mo[k][j]))
{
ma[i][j] = ma[i][k] + ma[k][j];
mo[i][j] = mo[i][k] + mo[k][j];
}
}
}
}
}
int main()
{
int T, s, d, a, b, c, f;
scanf("%d",&T);
while(T--)
{
scanf("%d %d %d %d", &n, &m, &s, &d);
for(int i = 0; i < n; i++)
{
for(int j = 0; j < n; j++)
{
if(i == j)
ma[i][j] = mo[i][j] = 0;
else
ma[i][j] = mo[i][j] = inf;
}
}
while(m--)
{
cin >> a >> b >> c >> f;
if(ma[a][b] > c)
{
ma[a][b] = c; ma[b][a] = c;
mo[a][b] = f; mo[b][a] = f;
}
}
Floyd(s, d);
cout << ma[s][d] <<" "<< mo[s][d] << endl;
}
return 0;
}
2、
人活着系列之芳姐和芳姐的猪
using namespace std;
int ma[MAXN][MAXN]; /*Floyd算法的特点:
时间复杂度o(n^3),一般节点个数200以下
用邻接矩阵保存图
适合求多源、无负权边的最短路。*/
int q[MAXN]; //记录猪在哪个猪圈
int n, m, k;
void Floyd( int n)
{
for( int k = 1; k <= n; k++) // 枚举中间点
{
for( int i = 1; i <= n; i++) // 枚举起点
{
for( int j = 1; j <= n; j++) // 枚举终点
{
if(ma[i][j] > ma[i][k] + ma[k][j]) // 松弛原理
{
ma[i][j] = ma[i][k] + ma[k][j];
}
}
}
}
}
int main()
{
scanf("%d %d %d", &n, &m, &k);
for(int i = 1; i <= m; i++) //初始化
{
for(int j = 1; j <= m; j++)
{
if(i == j)
ma[i][j] = 0;
else
ma[i][j] = inf;
}
}
for( int i = 1; i <= n; i++)
{
scanf("%d",&q[i]);
}
for( int i = 1; i <= k; i++)
{
int u, v, w;
cin >> u >> v >> w;
if(ma[u][v] > w)
ma[u][v] = ma[v][u] = w;
}
Floyd(m);
int min = inf;
for( int i = 1; i <= m; i++) //遍历猪圈
{
int sum = 0;
for( int j = 1; j <= n; j++) //每个猪所在的猪圈到指定猪圈的距离
{
sum += ma[q[j]][i];
}
if(sum < min)
min = sum;
}
cout << min << endl; //输出最小的距离
return 0;
}