HDU 1818 RP problem解题报告

news/2024/11/16 6:50:37/

一开始,我想的是建一个矩阵,然后尽量多的乘,做快速幂,做到后面会自然稳定,但是没去实现,考虑到一个问题,每个点的出度不一样,所以不是简单的求和,而且后面改边又要做矩阵快速幂,会tle。
后来学了发高斯消元,这道题充分利用了高斯消元的性质,因为改边只会影响最后一列,所以改一次边,就再在矩阵后面添加一列,增光。
最后,只需要枚举到底选取哪一列能使得答案最优就行了。

//
//  Created by Running Photon on 2016-03-06
//  Copyright (c) 2015 Running Photon. All rights reserved.
//
#include <algorithm>
#include <cctype>
#include <cmath>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <iomanip>
#include <iostream>
#include <map>
#include <queue>
#include <string>
#include <sstream>
#include <set>
#include <vector>
#include <stack>
#define ALL(x) x.begin(), x.end()
#define INS(x) inserter(x, x,begin())
#define ll long long
#define CLR(x) memset(x, 0, sizeof x)
using namespace std;
const int inf = 0x3f3f3f3f;
const int MOD = 1e9 + 7;
const int maxn = 1e3 + 10;
const int maxv = 1e2 + 10;
const double eps = 1e-9;double A[maxv][305];
int Gauss(int edu, int var) {int row, col;for(row = 0, col = 0; row < edu && col < var; row++, col++) {int maxrow = row;for(int i = row + 1; i < edu; i++) {if(fabs(A[maxrow][col]) < fabs(A[i][col])) maxrow = i;}if(fabs(A[maxrow][col]) < eps) return 0;if(maxrow != row) {for(int j = col; j < var; j++) {swap(A[maxrow][j], A[row][j]);}}for(int j = col + 1; j < var; j++) {A[row][j] /= A[row][col];}A[row][col] = 1;for(int i = row + 1; i < edu; i++) {for(int j = col + 1; j < var; j++) {A[i][j] -= A[row][j] * A[i][col];}A[i][col] = 0;}}return 1;
}
double out[maxv];int G[maxv][maxv];
int ID[maxv];
int main() {
#ifdef LOCALfreopen("in.txt", "r", stdin);
//  freopen("out.txt","w",stdout);
#endif
//  ios_base::sync_with_stdio(0);int T;scanf("%d", &T);while(T--) {int n, m;scanf("%d%d", &n, &m);CLR(out);CLR(G);CLR(A);for(int i = 0; i < m; i++) {int u, v;scanf("%d%d", &u, &v);G[u][v]++;out[u] += 1;}for(int i = 0; i < n; i++) {for(int j = 0; j < n; j++) {if(i != j && G[j][i]) {A[i][j] = 1.0 / out[j];}}A[i][i] = -1;}for(int i = 0; i <= n; i++)A[n-1][i] = 1;int cnt = 1;for(int i = 0; i < n - 1; i++) {if(!G[n - 1][i]) {for(int j = 0; j < n; j++) {if(G[n - 1][j]) {A[j][n + cnt] = 1.0 / (out[n - 1] + 1);}else A[j][n + cnt] = 0;}A[i][n + cnt] = 1.0 / (out[n - 1] + 1);A[n - 1][n + cnt] = 1;ID[cnt++] = i;}}if(!Gauss(n, n + cnt)) {puts("INF");continue;}int ans = -1;double mmax = A[n - 1][n] / A[n - 1][n - 1];for(int i = 1; i < cnt; i++) {if(A[n - 1][n] / A[n - 1][n + i] > mmax + eps) {mmax = A[n - 1][n] / A[n - 1][n + i];ans = ID[i];}}printf("1 %d\n", ans);}return 0;
}

http://www.ppmy.cn/news/244206.html

相关文章

BZOJ 1818: [Cqoi2010]内部白点

Description 如果一个点左右上下都有黑点&#xff0c;那么这个点也会变成黑点&#xff0c;问最后有多少个黑点\(n\leqslant 10^5\). Solution 扫描线. 显然变化后的点并不会产生新点&#xff0c;因为他的产生就需要他上下左右有点。 可以把他们转化成一些横纵的互不相交的直线.…

eoj1818 dijkstra求最短路及其条数

求出有n(1 < n < 100)个结点有向图中&#xff0c;结点1到结点n的最短路径&#xff0c;以及最短路径的条数。 Input 第一行有2个整数n和m( 0 < m < 3000)&#xff0c;接下来m行每行有三个整数u,v,w结点u到v之间有一条权为w的边(w<100000)。 Output 输出只有一…

自考总结:202304考期

考虑成绩昨天刚出&#xff0c;打算做下2023年4月考期的总结。 报考 202304考期报了三科&#xff1a;数据结构导论、管理经济学、信息系统开发与管理。这三科之中&#xff0c;除了信息系统开发与管理已经考过 2 次了&#xff0c;数据结构导论上次学了弃考了&#xff08;考前复…

bzoj 1818/1732 聚会

首先&#xff0c;答案的点一定在三组lca中的一个上 它在那个最深的lca上&#xff0c;不要问我为什么 或者&#xff0c;这三组lca一定有两个重复的&#xff0c;答案是那个不重复的。 #include<cstdio>#include<cstdlib>#include<cstring>#include<cmath>…

Yolov5 (v6.1)添加注意力机制

Apply Transformer in the backbone 1、要把注意力结构代码放到common.py文件中 2、手把手带你Yolov5 (v6.1)添加注意力机制(一)&#xff08;并附上30多种顶会Attention原理图&#xff09; 3、手把手带你Yolov5 (v6.1)添加注意力机制(二)&#xff08;在C3模块中加入注意力机…

最新万能门店小程序V5.1.0 独立版源码

使用说明&#xff08;更详细配置见程序根目录下的pdf文档&#xff09;&#xff1a; 1&#xff0c;宝塔新建网站&#xff0c;网站运行目录要指向/public 2&#xff0c;开启SSL&#xff0c;配置好伪静态 3&#xff0c;把网址www.niumawu.com批量替换为你自己的网址 4&#xff0c…

NOI 1818:红与黑(C++)

题目地址&#xff1a;http://noi.openjudge.cn/ch0205/1818/ 题目&#xff1a;求地图中能到达的黑砖总数 一开始没有思路&#xff0c;参考了&#xff1a;http://blog.csdn.net/c20190102/article/details/52329390 思路&#xff1a;简单搜索 使用二维数组保存地图&#xff…

ural 1818 Fair Fishermen

题意&#xff1a; 有n个人分鱼&#xff0c;第一个人先来拿&#xff0c;检查一下总数&#xff0c;如果不能恰好分成n份&#xff0c;则扔掉多余的部分&#xff0c;然后拿走自己应得的1/n&#xff0c;第二个人也重复这个步骤&#xff0c;直到第n个人&#xff0c;然后告诉你每次扔掉…