HDU 4370 0 or 1 最小环

#include <bits/stdc++.h>
//题目要求01矩阵的
//第一行除了A11只能有1个1
//最后一列除了Ann只能有1个1
//除了矩阵的四条边,里面的点要求该点所在行列1的个数各自相等
//最后可以发现 如果说题目给了一个完全图的边权矩阵,那么01矩阵就显示了在这个图上的的一条路径
//巧妙的修改spfa求最小环就oK
using namespace std; #define LL long long const int maxn=3e2+10; int dis[maxn]; bool vis[maxn]; int a[maxn][maxn]; int n; int spfa(int st) { queue<int>q; memset(dis,0x3f,sizeof dis); for(int i=1;i<=n;i++) { if(i==st)continue; q.push(i); vis[i]=true; dis[i]=a[st][i]; } while(!q.empty()) { int u=q.front();q.pop();vis[u]=0; for(int v=1;v<=n;v++) { if(v==u)continue; if(dis[v]>dis[u]+a[u][v]){ dis[v]=dis[u]+a[u][v]; if(!vis[v]) q.push(v), vis[v]=1; } } } // for(int i=1;i<=n;i++) // printf("%d ",dis[i]);printf("\n"); return 0; } int main() { #ifdef shuaishuai freopen("in.txt","r",stdin); #endif // shuaishuai while(~scanf("%d",&n)) { for(int i=1;i<=n;i++) for(int j=1;j<=n;j++)scanf("%d",&a[i][j]); int s,b,c; spfa(1); s=dis[1]; c=dis[n]; spfa(n); b=dis[n]; printf("%d\n",min(c,s+b)); } return 0; }

 

posted @ 2018-10-15 17:52  BIack_Cat  阅读(96)  评论(0编辑  收藏  举报