您的位置:首页 > 其它

POJ 1161 WALLS (FLOYD)

2013-01-23 17:35 337 查看
最近和几个高中同学玩得挺HIGH的,真的很高兴啊,一年没见了,各种感叹,大家也都谈了自己的大学生活。果然生活无基友不行啊!

不说了,最近也是很难更新了,同学们都陆续回来了,今天这题也是前天压下来的。

思路:将regions作为构图的点,相邻的regions之间连接一条权值为1的边。用Floyd将所有的regions之间需要的花费求出。最后枚举每个region求出最小花费的那个region。

#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
const int oo=1000000;
inline int min(int a,int b)
{
return a<b?a:b;
}
int link[255][255];//表示边(i,j)所相接的区域
int mem[35];//第i个人所在点
int n,m,l;
int dis[205][205];//区域i与j之间的距离
struct node
{
int cnt;
int p[205];
} data[255];//对于点i,与之相关的区域总数为cnt,存储对应区域p[j](j<cnt)
int main()
{
int sum,pre,now,fir,anstmp,ans;
while(cin>>m>>n>>l)
{
for(int i=1; i<=l; i++)
cin>>mem[i];
memset(link,-1,sizeof(link));
for(int i=1; i<=n; i++)
data[i].cnt=0;
for(int i=1; i<=m; i++)
for(int j=1; j<=m; j++)
dis[i][j]=(i==j?0:oo);
for(int i=1; i<=m; i++)
{
cin>>sum>>fir;
pre=fir;
data[fir].p[data[fir].cnt++]=i;
for(int j=1; j<sum; j++)
{
cin>>now;
data[now].p[data[now].cnt++]=i;
if(link[pre][now]==-1)
link[pre][now]=link[now][pre]=i;
else dis[i][link[pre][now]]=dis[link[pre][now]][i]=1;
pre=now;
}
if(link[pre][fir]==-1)
link[pre][fir]=link[fir][pre]=i;
else dis[i][link[pre][fir]]=dis[link[pre][fir]][i]=1;
}
for(int k=1; k<=m; k++)
for(int i=1; i<=m; i++)
for(int j=1; j<=m; j++)
if(dis[i][j]>dis[i][k]+dis[k][j])
dis[i][j]=dis[i][k]+dis[k][j];
ans=oo;
for(int i=1; i<=m; i++)
{
anstmp=0;
for(int j=1; j<=l; j++)
{
int tmp=oo;
for(int k=0; k<data[mem[j]].cnt; k++)
tmp=min(tmp,dis[i][data[mem[j]].p[k]]);
anstmp+=tmp;
}
ans=min(anstmp,ans);
}
cout<<ans<<endl;
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: