标签:pre fine ++ \n name mil include color 一个
题目大意:给定一个有向图,其中边有边权。求点数最少的正环的点数。
题解:建立矩阵,处理其二进制上每一位的状态。时间O(n^3*log(n))。
代码:
#include<cstdio> #include<algorithm> using namespace std; #define N 305 #define ll long long #define inf 0x7fffffff int n,m; struct jz { ll s[N][N]; bool check() { for(int i=1;i<=n;i++) if(s[i][i])return 1; return 0; } jz operator * (jz a) { jz b; for(int i=1;i<=n;i++) { for(int j=1;j<=n;j++) { b.s[i][j]=-inf; for(int k=1;k<=n;k++) { b.s[i][j]=max(b.s[i][j],s[i][k]+a.s[k][j]); } } } return b; } }p[15],p0,p1; int main() { scanf("%d%d",&n,&m); for(int i=1;i<=n;i++) for(int j=1;j<=n;j++) if(i!=j) p[0].s[i][j]=-inf; for(int a,b,c,d,i=1;i<=m;i++) { scanf("%d%d%d%d",&a,&b,&c,&d); p[0].s[a][b]=c; p[0].s[b][a]=d; } for(int i=1;i<=9;i++) p[i]=p[i-1]*p[i-1]; if(!p[9].check()) { printf("0\n"); return 0; } for(int i=1;i<=n;i++) for(int j=1;j<=n;j++) if(i!=j) p0.s[i][j]=-inf; int ans = 0; for(int i=9;i>=0;i--) { p1=p0*p[i]; if(!p1.check()) { p0=p1; ans|=(1<<i); } } printf("%d\n",ans+1); return 0; }
标签:pre fine ++ \n name mil include color 一个
原文地址:https://www.cnblogs.com/LiGuanlin1124/p/9775870.html