您的位置:首页 > 其它

POJ2139 Six Degrees of Cowvin Bacon 最短路

2014-07-15 20:54 267 查看
这题水题,就是将出现在同一电影的牛两两连上一个权为1的边,然后询问任意两头牛之间的“距离”。这里直接用的是floyd求最短路。

#ifndef HEAD
#include <stdio.h>
#include <vector>
#include <math.h>
#include <string.h>
#include <string>
#include <iostream>
#include <queue>
#include <list>
#include <algorithm>
#include <stack>
#include <map>

using namespace std;
#endif // !HEAD

#ifndef QUADMEMSET
inline void QuadMemSet(void* dst, int iSize, int value)
{
iSize = iSize / 4;
int* newDst = (int*)dst;
#ifdef WIN32
__asm
{
mov edi, dst
mov ecx, iSize
mov eax, value
rep stosd
}
#else
for (int i = 0; i < iSize; i++)
{
newDst[i] = value;

}
#endif
}
#endif

int Dis[301][301];

void Flyod(int N)
{
for (int k = 1; k <= N;k++)
{
for (int i = 1; i <= N;i++)
{
for (int j = 1; j <= N;j++)
{
Dis[i][j] = min(Dis[i][j], Dis[i][k] + Dis[k][j]);
}
}
}
}

int main()
{
#ifdef _DEBUG
freopen("d:\\in.txt", "r", stdin);
#endif
int N, M;
vector<int> tmp;
scanf("%d %d\n", &N, &M);
QuadMemSet(Dis, sizeof(Dis), 10000000);
for (int i = 0; i < M;i++)
{
int c;
tmp.clear();
scanf("%d", &c);
tmp.resize(c);
for (int j = 0; j < c;j++)
{
scanf("%d", &tmp[j]);
}
for (int j = 0; j < c;j++)
{
for (int h = 0; h < c;h++)
{
if (tmp[j] == tmp[h])
{
Dis[tmp[j]][tmp[j]] = 0;
}
else
{
Dis[tmp[h]][tmp[j]] = 1;
Dis[tmp[j]][tmp[h]] = 1;
}
}
}
}
Flyod(N);
int imin = 1000000;
for (int i = 1; i <= N;i++)
{
int sum = 0;
for (int j = 1; j <= N;j++)
{
if (i == j)
{
continue;
}
sum += Dis[i][j];
}
if (imin > sum)
{
imin = sum;
}
}
printf("%d\n", imin * 100 / (N - 1));

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