记录编号 |
46989 |
评测结果 |
AAAAAA |
题目名称 |
血缘关系 |
最终得分 |
100 |
用户昵称 |
王者自由 |
是否通过 |
通过 |
代码语言 |
C++ |
运行时间 |
1.203 s |
提交时间 |
2012-10-30 10:01:56 |
内存使用 |
116.16 MiB |
显示代码纯文本
#include <cstdio>
#include <algorithm>
using namespace std;
const int N = 300 + 10;
class bign {
public:
int l, n[N];
void clear() {
l = 0;
fill(n, n+N, 0);
}
void print() {
if(n[0] == 1)
printf("%d", 100);
else {
if(n[1]) printf("%d", n[1]);
printf("%d", n[2]);
if(l > 3) printf(".");
for(int i=3; i<l; i++)
printf("%d", n[i]);
} printf("%c\n", '%');
}
void div() {
int r = 0;
for(int i=0; i<=l; i++) {
r = r * 10 + n[i];
n[i] = (r >> 1);
r &= 1;
} if(n[l]) l++;
}
void plus(bign b) {
l = max(l, b.l);
for(int i=l-1; i>=0; i--) {
n[i] += b.n[i];
if(n[i] > 9) n[i] %= 10, n[i-1]++;
} while(l > 3 && !n[l-1]) l--;
}
} p[N][N], t;
int f[N][2];
bool l[N][N], g[N][N] = {0};
void DFS(int x, int y) {
if(l[x][y]) return;
p[x][y].clear();
if(x == y) {
p[x][y].l = 1, p[x][y].n[0] = 1;
} else if(!g[x][y] && f[x][0] > 0) {
int a = f[x][0], b = f[x][1];
DFS(a, y); DFS(b, y);
t = p[a][y]; t.div(); p[x][y].plus(t);
t = p[b][y]; t.div(); p[x][y].plus(t);
} else if(!g[y][x] && f[y][0] > 0) {
int a = f[y][0], b = f[y][1];
DFS(x, a); DFS(x, b);
t = p[x][a]; t.div(); p[x][y].plus(t);
t = p[x][b]; t.div(); p[x][y].plus(t);
} p[y][x] = p[x][y];
l[x][y] = l[y][x] = 1;
}
int main() {
freopen("kankei.in", "r", stdin);
freopen("kankei.out", "w", stdout);
int n, m, t, a, x, y;
scanf("%d %d", &n, &m);
for(int i=0; i<m; i++) {
scanf("%d %d %d", &a, &x, &y);
f[a][0] = x, f[a][1] = y;
g[x][a] = g[y][a] = 1;
}
for(int k=1; k<=n; k++)
for(int i=1; i<=n; i++)
for(int j=1; j<=n; j++)
g[i][j] = g[i][j] || g[i][k] & g[k][j];
scanf("%d", &t);
for(int i=0; i<t; i++) {
scanf("%d %d", &x, &y);
DFS(x, y);
p[x][y].print();
}
return 0;
}