1. 程式人生 > >HDU 4370 0 or 1 最小環

HDU 4370 0 or 1 最小環

urn int ifdef size std ems return spf queue

#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; }

HDU 4370 0 or 1 最小環