| ||||||||||
| Online Judge | Problem Set | Authors | Online Contests | User | ||||||
|---|---|---|---|---|---|---|---|---|---|---|
| Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest | |||||||||
大牛帮忙查下错呀,小弟快疯了,给几个强的数据也行~~~~~~~~~~~~~~~~~~~~~#include <iostream>
using namespace std;
struct Island
{
__int64 num;
__int64 value;
};
Island islands[1 << 13][13][13];
int map[13][13];
int n, m;
int value[13];
__int64 re, re1;
int main()
{
//freopen("in.txt", "r", stdin);
//freopen("out.txt", "w", stdout);
int cases;
scanf("%d", &cases);
while (cases--)
{
scanf("%d%d", &n, &m);
for (int i = 0; i < n; i++)
{
scanf("%d", &value[i]);
}
/*for (int i = 0; i < n; i++)
printf("%d ", value[i]);
printf("\n");
*/
memset(map, 0, sizeof(map));
for (int i = 0; i < m; i++)
{
int temp, temp1;
scanf("%d%d", &temp, &temp1);
map[temp - 1][temp1 - 1] = 1;
map[temp1 - 1][temp - 1] = 1;
}
//dp
if (n == 1)
{
printf("%d 1\n", value[0]);
break;
}
memset(islands, 0, sizeof(islands));
for (int i = 0; i < n; i++)
{
for (int j =i + 1; j < n; j++)
{
if (map[i][j])
{
int temp = (1 << i) | (1 << j);
islands[temp][i][j].value = value[i] + value[j] + value[i] * value[j];
islands[temp][j][i].value = value[i] + value[j] + value[i] * value[j];
islands[temp][i][j].num = islands[temp][j][i].num = 1;
}
}
}
for (int i = 0; i < (1 << n); i++)
{
for (int j =0; j < n; j++)
{
if ((i >> j) & 1)
{
for (int k = 0; k < n; k++)
{
if ((i >> k) & 1)
{
if (islands[i][j][k].value)
{
for (int o = 0; o < n; o++)
{
if (((i >> o) & 1) == 0 && map[k][o])
{
int t = i | (1 << o);
int temp = value[k] * value[o] + value[o];
if (map[j][o]) temp += value[j] * value[k] * value[o];
if (islands[i][j][k].value + temp > islands[t][k][o].value)
{
islands[t][k][o].value = islands[i][j][k].value + temp;
islands[t][k][o].num = islands[i][j][k].num;
}
else if (islands[i][j][k].value + temp == islands[t][k][o].value)
{
islands[t][k][o].num += islands[i][j][k].num;
}
}
}
}
}
}
}
}
}
int t = (1 << n) - 1;
re = 0;
re1 = 0;
/*for (int i = 0; i < n; i++)
{
for (int j = 0; j < n; j++)
{
printf("%d ", islands[t][i][j].value);
}
printf("\n");
}*/
for (int i = 0; i < n; i++)
{
for (int j = 0; j < n; j++)
{
if (islands[t][i][j].value > re)
{
re = islands[t][i][j].value;
re1 = islands[t][i][j].num;
}
else if (islands[t][i][j].value == re)
{
re1 += islands[t][i][j].num;
}
}
}
printf("%I64d %I64d\n", re, re1 / 2);
}
}
Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator