又是模板题。。。
直接套后来的加强版模板就可以了
建立m行n列的矩阵,并解对应方程
代码如下:
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#define MAXN 400
using namespace std;
int x[MAXN];
int free_x[MAXN];
int a[MAXN][MAXN];
char sta[10], end[10];
char str[][5] = {"MON", "TUE", "WED", "THU",
"FRI", "SAT", "SUN"};
void print(int m, int n) {
for(int i=0; i<m; ++i) {
for(int j=0; j<=n; ++j)
printf("%d ", a[i][j]);
puts("");
}
}
int gcd(int a, int b) {
return b ? gcd(b, a%b) : a;
}
int lcm(int a, int b) {
return a/gcd(a, b)*b;
}
int gauss(int m, int n) {
int ta, tb, LCM, col;
int free_x_num, free_index;
int i, j, k, max_r, tmp;
for(int i=0; i<=n; ++i) {
x[i] = 0;
free_x[i] = true;
}
col = 0;
for(k=0; k<m&&col<n; ++k, ++col) {
max_r = k;
for(i=k+1; i<m; ++i) {
if(abs(a[i][col]) > abs(a[max_r][col]))
max_r = i;
}
if(max_r != k)
for(j=k; j<=n; ++j)
swap(a[k][j], a[max_r][j]);
if(a[k][col] == 0) {
--k;
continue;
}
for(i=k+1; i<m; ++i) {
if(a[i][col] != 0) {
LCM = lcm(abs(a[i][col]), abs(a[k][col]));
ta = LCM/abs(a[i][col]);
tb = LCM/abs(a[k][col]);
if(a[i][col] * a[k][col] < 0)
tb = -tb;
for(j=col; j<=n; ++j)
a[i][j] = ((a[i][j]*ta-a[k][j]*tb)%7+7)%7;
}
}
}
for(i=k; i<m; ++i)
if(a[i][col]) return -1;
if(k < n) {
for(i=k-1; i>=0; --i) {
free_x_num = 0;
for(j=0; j<n; ++j) {
if(a[i][j]!=0 && free_x[j])
free_x_num++, free_index = j;
}
if(free_x_num > 1) continue;
tmp = a[i][n];
for(j=0; j<n; ++j) {
if(a[i][j] && j!=free_index)
tmp -= a[i][j]*x[j]%7;
tmp = (tmp%7+7)%7;
}
x[free_index] = (tmp/a[i][free_index])%7;
free_x[free_index] = 0;
}
return n-k;
}
for(i=n-1; i>=0; --i) {
tmp = a[i][n];
for(j=i+1; j<n; ++j) {
if(a[i][j]) {
tmp -= a[i][j]*x[j];
}
tmp = (tmp%7+7)%7;
}
while(tmp%a[i][i] != 0) tmp+=7;
x[i] = tmp/a[i][i]%7;
}
return 0;
}
int get_day(char s1[], char s2[]) {
int x, y;
for(int i=0; i<7; ++i) {
if(strcmp(s1, str[i]) == 0) {
x = i;
break;
}
}
for(int i=0; i<7; ++i) {
if(strcmp(s2, str[i]) == 0) {
y = i;
break;
}
}
int tmp = y+1-x;
return tmp;
}
int main(void) {
int m, n, k, nx;
while(scanf("%d%d", &n, &m) && (n||m)) {
memset(a, 0, sizeof(a));
for(int i=0; i<m; ++i) {
scanf("%d", &k);
scanf("%s%s", sta, end);
a[i][n] = (get_day(sta, end)%7+7)%7;
while(k--) {
scanf("%d", &nx);
--nx;
++a[i][nx];
a[i][nx] %= 7;
}
}
//print(m, n);
int ans = gauss(m, n);
//print(m, n);
if(ans == -1) puts("Inconsistent data.");
else if(ans == 0){
for(int i=0; i<n; ++i)
if(x[i] < 3)
x[i] += 7;
for(int i=0; i<n-1; ++i)
printf("%d ", x[i]);
printf("%d\n", x[n-1]);
}
else puts("Multiple solutions.");
}
return 0;
}