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;
}
不说了,最近也是很难更新了,同学们都陆续回来了,今天这题也是前天压下来的。
思路:将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;
}
相关文章推荐
- POJ 1161 Walls(floyd最短路)#by zh
- POJ 1161 walls
- Floyd 求最短路(poj 1161)
- [POJ 1161] Walls 建图
- poj1161 - Walls
- POJ 1161 Walls(二分图匹配)
- poj 1161 walls
- POJ 1161 Walls(建图+Floyd)
- POJ 1161 Walls
- poj1161 walls floyd算法+把面当结点建图
- poj1161 Walls
- POJ 1161 Walls(最短路+枚举)
- poj 1161 Walls
- POJ1161 Walls(Floyd+建图)
- POJ 1161 Walls
- POJ 1161 Floyd 构图
- POJ 1161 WALLS
- POJ 2240 && HDU 1217 Arbitrage(Floyd)
- POJ 1125 裸最短路 Floyd
- Floyd_Warshall POJ 3660 Cow Contest