HDU 1818 RP problem解題報告

2021-07-10 08:36:39 字數 1842 閱讀 4565

一開始,我想的是建乙個矩陣,然後盡量多的乘,做快速冪,做到後面會自然穩定,但是沒去實現,考慮到乙個問題,每個點的出度不一樣,所以不是簡單的求和,而且後面改邊又要做矩陣快速冪,會tle。

後來學了發高斯消元,這道題充分利用了高斯消元的性質,因為改邊只會影響最後一列,所以改一次邊,就再在矩陣後面新增一列,增光。

最後,只需要列舉到底選取哪一列能使得答案最優就行了。

//

// created by running photon on 2016-03-06

//#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#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)

if(fabs(a[maxrow][col]) < eps) return

0; if(maxrow != row)

}for(int j = col + 1; j < var; j++)

a[row][col] = 1;

for(int i = row + 1; i < edu; i++)

a[i][col] = 0;}}

return1;}

double out[maxv];

int g[maxv][maxv];

int id[maxv];

int main()

for(int i = 0; i < n; i++)

}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++)

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))

int ans = -1;

double mmax = a[n - 1][n] / a[n - 1][n - 1];

for(int i = 1; i < cnt; i++)

}printf("1 %d\n", ans);

}return

0;}

Dijkstra演算法解HDU1874

dijkstra演算法是用來解決 確定起點的最短路徑問題 即已知起始結點,求最短路徑的問題。它是常用的最短路徑演算法之一。最常用的路徑演算法有 dijkstra演算法 a 演算法 bellman ford演算法 floyd warshall演算法 johnson演算法。缺陷 它一般用來解決正權,單源...

hdu 1166 樹狀陣列解

樹狀陣列解決 關於樹狀陣列參考大佬的部落格 然後就很好理解這題了,附上 hdu 1166 單點修改,區間查詢 include include include define max 50010 using namespace std inttree max intarr max intn int lo...

HDU 1028 母函式解 完全揹包解

初學母函式,練練手 母函式解 求整數n的整數拆分方法 題目理解為 將數字1 2 3 n 每個數字可以選取無限次,求能組成n的情況總數 函式 1 x x 2 x 3 1 x 2 x 4 1 x 3 x 6 x 9 第一項的意義是 取0個1,取1個1 2個1,3個1 第二項的意義是 取0個2,取1個2 ...