POJ 2947 高斯消元

//Result:wizmann	2947	Accepted	1144K	1813MS	G++	2291B
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <iostream>
#include <algorithm>
#include <cmath>
#include <map>

using namespace std;

#define print(x) cout<<x<<endl
#define input(x) cin>>x
#define SIZE 320
#define BUF 30
#define WEEK 7

map<string,int> date;

void init()
{
	date["MON"]=0;
	date["TUE"]=1;
	date["WED"]=2;
	date["THU"]=3;
	date["FRI"]=4;
	date["SAT"]=5;
	date["SUN"]=6;
}

int n,m;
int matrix[SIZE][SIZE];

int gcd(int a,int b)
{
	if(b>a) return gcd(b,a);
	else if(a%b==0) return b;
	else return gcd(b,a%b);
}

inline int lcm(int a,int b)
{
	return a*b/gcd(a,b);
}

int gauss()
{
	int row,col;
	for(row=0,col=0;row<m&&col<n;row++,col++)
	{
		int k=row;
		for(int i=row+1;i<m;i++)
		{
			if(abs(matrix[k][col])<abs(matrix[i][col])) k=i;
		}
		if(k!=row)
		{
			for(int i=col;i<=n;i++)
			{
				swap(matrix[row][i],matrix[k][i]);
			}
		}
		if(!matrix[row][col])
		{
			row--;
			continue;
		}
	
		for(int i=row+1;i<m;i++)
		{
			if(matrix[i][col])
			{
				int LCM=lcm(abs(matrix[i][col]),abs(matrix[row][col]));
				int a=LCM/matrix[i][col];
				int b=LCM/matrix[row][col];
				for(int j=col;j<=n;j++)
				{
					matrix[i][j]=(matrix[i][j]*a-matrix[row][j]*b)%WEEK;
				}
			}
		}
	}
	for(int i=row;i<m;i++)
	{
		if(matrix[i][n]) return -1;
	}
	if(row<n) return 1;
	
	int x[SIZE]={0};
	for(int i=n-1;i>=0;i--)
	{
		int tp=matrix[i][n];
		for(int j=i+1;j<n;j++)
		{
			tp-=matrix[i][j]*x[j];
		}
		while(tp%matrix[i][i]) tp+=WEEK;

		x[i]=tp/matrix[i][i];
		while(x[i]<3) x[i]+=WEEK;
		while(x[i]>9) x[i]-=WEEK;
	}
	for(int i=0;i<n-1;i++)
	{
		printf("%d ",x[i]);
	}
	printf("%d\n",x[n-1]);
	return 0;
}

int main()
{
	init();
	int a;
	char start[BUF],end[BUF];
	while(scanf("%d%d",&n,&m)!=EOF && n+m)
	{
		memset(matrix,0,sizeof(matrix));
		for(int i=0;i<m;i++)
		{
			int k;
			scanf("%d",&k);
			scanf("%s%s",start,end);
			int day=date[end]-date[start];
			day=(day%WEEK+WEEK+1)%WEEK;
			matrix[i][n]=day;
			for(int j=0;j<k;j++)
			{
				scanf("%d",&a);
				matrix[i][a-1]++;
				matrix[i][a-1]%=WEEK;
			}
		}
		int res=gauss();
		if(res==1) puts("Multiple solutions.");
		else if(res==-1) puts("Inconsistent data.");
	}
	return 0;
}

  

//Result:wizmann2947Accepted1144K1813MSG++2291B#include <cstdio>#include <cstdlib>#include <cstring>#include <iostream>#include <algorithm>#include <cmath>#include <map>
using namespace std;
#define print(x) cout<<x<<endl#define input(x) cin>>x#define SIZE 320#define BUF 30#define WEEK 7
map<string,int> date;
void init(){date["MON"]=0;date["TUE"]=1;date["WED"]=2;date["THU"]=3;date["FRI"]=4;date["SAT"]=5;date["SUN"]=6;}
int n,m;int matrix[SIZE][SIZE];
int gcd(int a,int b){if(b>a) return gcd(b,a);else if(a%b==0) return b;else return gcd(b,a%b);}
inline int lcm(int a,int b){return a*b/gcd(a,b);}
int gauss(){int row,col;for(row=0,col=0;row<m&&col<n;row++,col++){int k=row;for(int i=row+1;i<m;i++){if(abs(matrix[k][col])<abs(matrix[i][col])) k=i;}if(k!=row){for(int i=col;i<=n;i++){swap(matrix[row][i],matrix[k][i]);}}if(!matrix[row][col]){row--;continue;}for(int i=row+1;i<m;i++){if(matrix[i][col]){int LCM=lcm(abs(matrix[i][col]),abs(matrix[row][col]));int a=LCM/matrix[i][col];int b=LCM/matrix[row][col];for(int j=col;j<=n;j++){matrix[i][j]=(matrix[i][j]*a-matrix[row][j]*b)%WEEK;}}}}for(int i=row;i<m;i++){if(matrix[i][n]) return -1;}if(row<n) return 1;int x[SIZE]={0};for(int i=n-1;i>=0;i--){int tp=matrix[i][n];for(int j=i+1;j<n;j++){tp-=matrix[i][j]*x[j];}while(tp%matrix[i][i]) tp+=WEEK;
x[i]=tp/matrix[i][i];while(x[i]<3) x[i]+=WEEK;while(x[i]>9) x[i]-=WEEK;}for(int i=0;i<n-1;i++){printf("%d ",x[i]);}printf("%d\n",x[n-1]);return 0;}
int main(){freopen("input.txt","r",stdin);init();int a;char start[BUF],end[BUF];while(scanf("%d%d",&n,&m)!=EOF && n+m){memset(matrix,0,sizeof(matrix));for(int i=0;i<m;i++){int k;scanf("%d",&k);scanf("%s%s",start,end);int day=date[end]-date[start];day=(day%WEEK+WEEK+1)%WEEK;matrix[i][n]=day;for(int j=0;j<k;j++){scanf("%d",&a);matrix[i][a-1]++;matrix[i][a-1]%=WEEK;}}int res=gauss();if(res==1) puts("Multiple solutions.");else if(res==-1) puts("Inconsistent data.");}return 0;}

 

posted on 2012-05-12 10:20  Wizmann  阅读(344)  评论(0)    收藏  举报

导航