您的位置:首页 > 其它

HDU 4370 0 or 1(最短路)

2014-06-28 09:29 267 查看
Description
Given a n*n matrix Cij (1<=i,j<=n),We want to find a n*n matrix Xij (1<=i,j<=n),which is 0 or 1.

Besides,Xij meets the following conditions:


1.X12+X13+...X1n=1

2.X1n+X2n+...Xn-1n=1

3.for each i (1<i<n), satisfies ∑Xki (1<=k<=n)=∑Xij (1<=j<=n).


For example, if n=4,we can get the following equality:


X12+X13+X14=1

X14+X24+X34=1

X12+X22+X32+X42=X21+X22+X23+X24

X13+X23+X33+X43=X31+X32+X33+X34


Now ,we want to know the minimum of ∑Cij*Xij(1<=i,j<=n) you can get.

Input
The input consists of multiple test cases (less than 35 case).
For each test case ,the first line contains one integer n (1<n<=300).
The next n lines, for each lines, each of which contains n integers,
illustrating the matrix C, The jth integer on ith line is Cij(0<=Cij<=100000).

Output
For each case, output the minimum of ∑Cij*Xij you can get.
Sample Input
4
1 2 4 10
2 0 1 1
2 2 0 5
6 3 1 2

Sample Output
3

Hint
For sample, X12=X24=1,all other Xij is 0.

最短路

#include <cstdio>
#include <queue>
#include <iostream>
using namespace std;
int date[310][310];
int n;
/*const int maxe=310;
int dis[maxe];
bool v[maxe];
void dijkstra()
{
	for (int i=1;i<=n;++i)
	{
		dis[i]=1e9;
	}
	dis[1]=0;
	memset(v,0,sizeof(v));
	for (int i=1;i<=n;++i)
	{
		int mark=-1,mindis=1e9;
		for (int j=1;j<=n;++j)
		{
			if(!v[j]&&dis[j]<mindis)
			{
				mindis=dis[j];
				mark=j;
			}
			v[mark]=1;
			for (int j=1;j<=n;++j) 
				if (!v[j])
				{
					dis[j]=dis[j]<(dis[mark]+date[mark][j])?dis[j]:(dis[mark]+date[mark][j]);
					printf("%d %d\n",j,dis[j]);
					}
		}
	}
	return ;
}*/
const int INF=0x3f3f3f3f;
const int MAXN=330;
int dis[MAXN];
int que[MAXN];
bool vis[MAXN];

void SPFA(int start,int n)
{
    int front=0,rear=0;
    for(int v=1;v<=n;v++)
    {
        if(v==start)
        {
            dis[v]=INF;
            vis[v]=false;
        }
        else if(date[start][v]!=INF)
        {
            dis[v]=date[start][v];
            que[rear++]=v;
            vis[v]=true;
        }
        else
        {
            dis[v]=INF;
            vis[v]=false;
        }
    }

    while(front!=rear)
    {
        int u=que[front++];
        for(int v=1;v<=n;v++)
        {
            if(dis[v]>dis[u]+date[u][v])
            {
                dis[v]=dis[u]+date[u][v];
                if(!vis[v])
                {
                    vis[v]=true;
                    que[rear++]=v;
                    if(rear>=MAXN) rear=0;
                }
            }
        }
        vis[u]=false;
        if(front>=MAXN)front=0;
    }

}
int main ()
{
	//freopen ("heh.txt","r",stdin);
	while (scanf("%d",&n)!=EOF)
	{
		for (int i=1;i<=n;i++)
		{
			for (int j=1;j<=n;j++)
			{
				scanf("%d",&date[i][j]);
			}
			date[i][i]=0;
		}
		SPFA(1,n);
      	  	int ans=dis
;
       	 	int loop1=dis[1];
       	 	SPFA(n,n);
        	int loopn=dis
;
      	  	ans=min(ans,loop1+loopn);
        	printf("%d\n",ans);
	}
	return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: