Yes, it's possible with declarative automation, but with a couple of caveats -
- Flow/Process Builder might not be the best/easiest tool for the job. Is
Opportunity_Contact__c Master-Detail? If so, a Roll-Up Summary Field might do the trick with nothing further required. If it's a Lookup relationship, Declarative Lookup Rollup Summaries could do this for you. (And DLRS automatically handles events like record merges for you).
- When your Opportunity is first inserted, you won't have any children to inspect at the time of insert. You'd need to be looking at the children when they are inserted.
It doesn't make sense to me to run the process at the time of editing an Opportunity (rather than editing or inserting an
Opportunity_Contact__c). However, if that's your required design, you would use a Process Builder on Opportunity to start an autolaunched Flow, passing the Opportunity Id as a parameter.
The flow would then do a Fast Lookup of
Opportunity_Contact__c records attached to that Opportunity. It would have a variable (call it
Max_Date or something), and would iterate in a Loop element over the
Opportunity_Contact__c sObject collection variable. For each element, it would compare the date on that
Max_Date and set
Max_Date to whichever of the two is higher.
The loop's end connector would go to an assignment of
Max_Date to a field on the parent Opportunity where that date belongs, and then to a Fast Update element.
I would suggest, though, that the Process Builder starting this flow off belongs on the child object,
Opportunity_Contact__c. The structure of the Flow would look pretty much the same, but Process Builder would pass it the Id of the
Opportunity_Contact__c's parent Opportunity to kick it off.