HDU - 4370 0 or 1 最短路
作者:互联网
题意:
给定n * n矩阵C ij(1 <= i,j <= n),我们要找到0或1的n * n矩阵X ij(1 <= i,j <= n)。 此外,X ij满足以下条件:
1.X 12 + X 13 + ... X 1n = 1
2.X 1n + X 2n + ... X n-1n = 1
3.对于每个i(1 <i <n),满足ΣXki(1 <= k <= n)=ΣXij(1 <= j <= n)。
例如,如果n = 4,我们可以得到以下等式:
X 12 + X 13 + X 14 = 1
X 14 + X 24 + X 34 = 1
X 12 + X 22 + X 32 + X 42 = X 21 + X 22 + X 23 + X 24
X 13 + X 23 + X 33 + X 43 = X 31 + X 32 + X 33 + X 34
现在,我们想知道你可以得到的最小ΣCij * X ij(1 <= i,j <= n)。
分析:
将数学模型转化为图论模型可以得到:
1点的出度是1,n点的入度是1,中间节点的入度等于出度。
因此跑个最短路就好了。
但是要注意也能是中间不联通。1点跟n点都是一节点数大于1的环。
所以两者取最小值就是答案。
#include<bits/stdc++.h>
using namespace std;
const int maxn=300+10;
int c[maxn][maxn];
bool vis[maxn];
int dis[maxn];
const int inf=0x3f3f3f3f;
void spfa(int s,int t,int n){
queue<int> q;
memset(vis,0,sizeof vis);
for(int i=2;i<=n;i++){
dis[i]=c[s][i];
vis[i]=1;
q.push(i);
}
dis[s]=inf;
while(!q.empty()){
int u=q.front();
q.pop();
vis[u]=0;
for(int v=1;v<=n;v++){
if(dis[v]>dis[u]+c[u][v]){
dis[v]=dis[u]+c[u][v];
if(!vis[v]){
vis[v]=1;
q.push(v);
}
}
}
}
}
int main(){
int n;
while(scanf("%d",&n)!=EOF){
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
scanf("%d",&c[i][j]);
}
}
spfa(1,n,n);
int ans=dis[n];
int l1=dis[1];
spfa(n,n,n);
int l2=dis[n];
ans=min(ans,l1+l2);
printf("%d\n",ans);
}
return 0;
}
标签:HDU,12,int,短路,13,vis,maxn,4370,1n 来源: https://blog.csdn.net/qq_40679299/article/details/86658010