poj 2139 Six Degrees of Cowvin Bacon 最短路bellman 多源最短路径 (一次AC)

来源:互联网 发布:linux 守护进程程序 编辑:程序博客网 时间:2024/06/11 16:39
Six Degrees of Cowvin Bacon
Time Limit: 1000MSMemory Limit: 65536KTotal Submissions: 3982Accepted: 1870

Description

The cows have been making movies lately, so they are ready to play a variant of the famous game "Six Degrees of Kevin Bacon". 

The game works like this: each cow is considered to be zero degrees of separation (degrees) away from herself. If two distinct cows have been in a movie together, each is considered to be one 'degree' away from the other. If a two cows have never worked together but have both worked with a third cow, they are considered to be two 'degrees' away from each other (counted as: one degree to the cow they've worked with and one more to the other cow). This scales to the general case. 

The N (2 <= N <= 300) cows are interested in figuring out which cow has the smallest average degree of separation from all the other cows. excluding herself of course. The cows have made M (1 <= M <= 10000) movies and it is guaranteed that some relationship path exists between every pair of cows. 

Input

* Line 1: Two space-separated integers: N and M 

* Lines 2..M+1: Each input line contains a set of two or more space-separated integers that describes the cows appearing in a single movie. The first integer is the number of cows participating in the described movie, (e.g., Mi); the subsequent Mi integers tell which cows were. 

Output

* Line 1: A single integer that is 100 times the shortest mean degree of separation of any of the cows. 

Sample Input

4 23 1 2 32 3 4

Sample Output

100

Hint

[Cow 3 has worked with all the other cows and thus has degrees of separation: 1, 1, and 1 -- a mean of 1.00 .] 

Source

USACO 2003 March Orange
分析:bellman的模板题目,稍微有点价值的就是多源最短路径的处理

#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
using namespace std;
#define inf 0x3f3f3f3f
int dist[305][305],a[305];
int n,m,num,cnt;
struct Edge{
int f,t,c;
}edge[1005];
void init()
{
memset(dist,0x3f,sizeof(dist));
for(int i=1;i<=1003;i++)
edge[i].c=inf;
cnt=0;
for(int i=1;i<=n;i++)
dist[i][i]=0; //注意dist[i][i]要初始化为0
}
void bellman()
{
for(int s=1;s<=n;s++) //多源最短路径的处理,在模板中单个起点的while循环外嵌套一层不同起点的循环,同时dist改为二维
{
while(1)
{
bool flag=false;
for(int j=1;j<=cnt;j++)
{
int from=edge[j].f,to=edge[j].t,cost=edge[j].c;
if(dist[s][to]>dist[s][from]+cost)
{
dist[s][to]=dist[s][from]+cost;
flag=true;
}
}
if(!flag)
break;
}
}
int minn=inf,w;
for(int i=1;i<=n;i++)
{
w=0;
for(int j=1;j<=n;j++)
w+=dist[i][j];
if(w<minn)
minn=w;
}
printf("%d\n",(minn*100)/(n-1));
}
int main()
{
while(~scanf("%d %d",&n,&m))
{
init();
for(int k=1;k<=m;k++)
{
scanf("%d",&num);
for(int j=1;j<=num;j++)
scanf("%d",&a[j]);
for(int i=1;i<=num-1;i++)
for(int j=i+1;j<=num;j++)
{
cnt++;
edge[cnt].f=a[i];
edge[cnt].t=a[j];
edge[cnt].c=1;
cnt++;
edge[cnt].f=a[j];
edge[cnt].t=a[i];
edge[cnt].c=1;
}
}
bellman();
}
return 0;
}



阅读全文
0 0
原创粉丝点击