poj 2947 java

import java.io.*;
import java.util.HashMap;

public class POJ_2947 {

	public static final int MAX = 310;
	static int equ,var;
	static int a[][];
	static int x[];
	static HashMap<String,Integer> hash = new HashMap<String,Integer>();
	
	public static void main(String[] args) throws Exception{
		hash.put("MON",0);hash.put("TUE",1);hash.put("WED",2);hash.put("THU",3);hash.put("FRI",4);hash.put("SAT",5);hash.put("SUN", 6);
		BufferedReader buf = new BufferedReader(new InputStreamReader(System.in));
		
		while(true){
			String str[] = buf.readLine().split(" ");
			var = Integer.parseInt(str[0]);
			equ = Integer.parseInt(str[1]);
			if(var==0&&equ==0)
				break;
			
			a = new int[MAX][MAX];
			x = new int[MAX];
			
			for(int i=0;i<equ;i++){
				str = buf.readLine().split(" ");
				int k = Integer.parseInt(str[0]);
				a[i][var] = ((hash.get(str[2])-hash.get(str[1])+1)%7+7)%7;
				
				str = buf.readLine().split(" ");
				for(int j=0;j<k;j++){
					int t = Integer.parseInt(str[j])-1;
					a[i][t]++;
					a[i][t] %= 7;
				}
			}
			
			int res = guass();
			
			if(res == 0){
				for(int i=0;i<var;i++)
					if(x[i]<3)
						x[i] += 7;
				for(int i=0;i<var-1;i++)
					System.out.print(x[i]+" ");
				System.out.print(x[var-1]);
				System.out.println();
			}else if(res == -1)
				System.out.println("Inconsistent data.");
			else
				System.out.println("Multiple solutions.");
			
		}

	}

	public static int guass() {
		
		int row , col;
		row = col = 0;
		
		while(row<equ&&col<var){
			int mr = row;
			for(int i=row+1;i<equ;i++){                        //保证从上到下 每个式子都保留着 0...var 的变量
				if(Math.abs(a[i][col])>Math.abs(a[mr][col]))
					mr = i;
			}
			
			if(mr != row)
				for(int i=col;i<=var;i++){
					int tmp = a[row][i];
					a[row][i] = a[mr][i];
					a[mr][i] = tmp;
				}
			
			if(a[row][col]==0){
				col++;
				continue;
			}
			
			for(int i=row+1;i<equ;i++){       // 以第row个式子为基础  化简其余剩下的式子(为了消去第col个变量)
				if(a[i][col]!=0){
					int L = lcm(Math.abs(a[i][col]),Math.abs(a[row][col]));
					int ta = L/Math.abs(a[i][col]); int tb = L/Math.abs(a[row][col]);
					if(a[i][col]*a[row][col]<0)   //考虑异号的情况
						tb = -tb;
					for(int j=col;j<=var;j++)
						a[i][j] = ((a[i][j]*ta-a[row][j]*tb)%7+7)%7;
				}
			}
			row++;   
			col++;
		}
		
		for(int i=row;i<equ;i++)      //求解 var个未知数 只需要var个式子  如果 有多余的式子(经化简后) 必全部为0 否则无解
			if(a[i][var]!=0)
				return -1;
		if(var>row)          // 判断是否有 变量 没有 在所有 式子中出现  或着 当row指到最后一个式子时  即总式子量<总未知数量
			return var-row;  // row 即为  所有式子中 所有的变量总数
		
		for(int i=var-1;i>=0;i--){
			int tmp = a[i][var];
			for(int j=i+1;j<var;j++)
				tmp = ((tmp-a[i][j]*x[j])%7+7)%7;
			while(tmp%a[i][i]!=0)
				tmp += 7;
			x[i] = (tmp/a[i][i])%7;
		}
		
		return 0;
	}

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

	public static int gcd(int a, int b) {
		
		return b==0?a:gcd(b,a%b);
	}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值