Description
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
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
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[n];
int loop1=dis[1];
SPFA(n,n);
int loopn=dis[n];
ans=min(ans,loop1+loopn);
printf("%d\n",ans);
}
return 0;
}