Determining sender/receiver address in transaction
There is no 1-to-1 mapping between senders and recipients. That's why things like CoinJoin is possible. Transactions are split in two parts: inputs (that redeem previously unspent outputs) and outputs (that send the coins). The redeemed coins are essentially pooled together before being sent so at this point there is no notion of which coin is which.

The transaction fee are also paid by this pool so no one specifically paid for the transaction but the sum of the inputs.