标签:弗洛伊德 变形 poj3660 lose 300 int maxn win include
#
我们能知道某cow的排名当且仅当知道它前面有多少,后面有多少
#
知道前面有多少?
建边的时候建一点指向比它强的人的边。
相当于问多少点和该点联通。
这个是最短路可以解决的事情(我猜也许拓扑排序也可
#
那后面呢?
反向建边
#如果n变得很大呢?
那就只能用dij,可那就变成了非多源最短路了。
也许不能兼得吧。(大数据学生不服.
---
第一遍的时候re了,因为m=4500,是大于我设置的maxn的。
mark.
#include <iostream> #include <math.h> #include <string.h> #include <vector> #include <map> #include <queue> #include <stdio.h> #include <algorithm> #include <cstdio> using namespace std; const int maxn=1e5; int n,m,win[maxn],lose[maxn],ans1[maxn],ans2[maxn],d[300][300]; int main( ) { //freopen("lys.in","r",stdin); cin>>n>>m; memset(d,0,sizeof(d)); for(int i=1;i<=m;i++) { cin>>win[i]>>lose[i]; d[lose[i]][win[i]]=1; } for(int k=1;k<=n;k++) for(int i=1;i<=n;i++) for(int j=1;j<=n;j++) { if(d[i][k]==1&&d[k][j]==1) { d[i][j]=1; } } for(int i=1;i<=n;i++) { for(int j=1;j<=n;j++) { if(i==j) continue; if(d[i][j]==1) { ans1[i]++; } } } memset(d,0,sizeof(d)); for(int i=1;i<=m;i++) { d[win[i]][lose[i]]=1; } for(int k=1;k<=n;k++) for(int i=1;i<=n;i++) for(int j=1;j<=n;j++) { if(d[i][k]==1&&d[k][j]==1) { d[i][j]=1; } } for(int i=1;i<=n;i++) { for(int j=1;j<=n;j++) { if(i==j) continue; if(d[i][j]==1) { ans2[i]++; } } } int ans=0; for(int i=1;i<=n;i++) { if(ans1[i]+ans2[i]==n-1) { ans++; } } printf("%d",ans); }
标签:弗洛伊德,变形,poj3660,lose,300,int,maxn,win,include 来源: https://www.cnblogs.com/liyishui2003/p/15368792.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。