题意:
无向图最小权环
思路:
Floyd变形
代码:
/*
ID: housera1
PROG: fence6
LANG: C++
*/
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<map>
using namespace std;
#define M 105
#define N 210
#define oo ~0u>>1
int m,n,ans;
int dis[N][N],maz[N][N];
struct node
{
int ed[M];
bool operator<(const node fa) const
{
int i;
for(i=1;i<=m;i++)
{
if(ed[i]!=fa.ed[i]) return ed[i]<fa.ed[i];
}
return false;
}
void init(int s)
{
memset(ed,0,sizeof(ed));
ed[s]=1;
}
}nd;
map<node,int> hashtab;
void floyd()
{
int k,i,j;
for(k=1;k<=n;k++)
{
for(i=1;i<=n;i++)
{
if(i==k||maz[i][k]==oo) continue;
for(j=1;j<=n;j++)
{
if(j==k||j==i||maz[k][j]==oo||dis[i][j]==oo) continue;
ans=min(ans,dis[i][j]+maz[i][k]+maz[k][j]);
}
}
for(i=1;i<=n;i++)
{
if(i==k||dis[i][k]==oo) continue;
for(j=1;j<=n;j++)
{
if(j==k||j==i||dis[k][j]==oo) continue;
dis[i][j]=min(dis[i][j],dis[i][k]+dis[k][j]);
}
}
}
}
int main(){
int Debug=0;
if(!Debug){
freopen("fence6.in","r",stdin);
freopen("fence6.out","w",stdout);
}
int i,j,in,u,v,n1,n2,id,len;
for(i=1;i<N;i++)
{
for(j=1;j<N;j++) dis[i][j]=maz[i][j]=oo;
dis[i][i]=0;
}
scanf("%d",&m);
for(i=1,n=0;i<=m;i++)
{
scanf("%d%d%d%d",&id,&len,&n1,&n2);
nd.init(id);
for(j=1;j<=n1;j++)
{
scanf("%d",&in);
nd.ed[in]=1;
}
if(hashtab[nd]==0) hashtab[nd]=++n;
u=hashtab[nd];
nd.init(id);
for(j=1;j<=n2;j++)
{
scanf("%d",&in);
nd.ed[in]=1;
}
if(hashtab[nd]==0) hashtab[nd]=++n;
v=hashtab[nd];
maz[u][v]=maz[v][u]=dis[u][v]=dis[v][u]=min(dis[u][v],len);
}
ans=oo;
floyd();
printf("%d\n",ans);
return 0;
}