USACO Section 4.1 Fence Loops

来源:互联网 发布:淘宝照片修图教程 编辑:程序博客网 时间:2024/05/20 09:45

题意:

无向图最小权环


思路:

Floyd变形


代码:

/*ID: housera1PROG: fence6LANG: C++*/#include<cstdio>#include<cstring>#include<algorithm>#include<map>using namespace std;#define M 105#define N 210#define oo ~0u>>1int 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;}


0 0